Суббота, 18.05.2024, 07:50
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » WEB-мастеру » Учебник » Псевдо-крон
Псевдо-крон
[FuN]Дата: Пятница, 14.01.2011, 14:13 | Сообщение # 1
Сообщений: 8
Репутация: 0
Награды: 0
Допустим у Вас есть shell-доступ к серверу, но пользоваться cron'ом вам по каким-либо причинам
запрещено... а так надо и как всегда срочно :). (Напомню, что Cron это программа, выполняющая
задания по расписаню. Позволяет неоднократный запуск заданий. Т.е. задание можно запустить в
определенное время или через определенный промежуток времени.) Что можно сделать в таком случае.
А нужно всего ничего - написать эмулятор крона. Идея проста как велосипед. Необходима привилегия
для запуска скриптов в фоне!
Способ №1
Пишем два скрипта cron1 и cron2 при запуске скрипта cron1, скрипт выполняет некие (нужные вам)
действия и засыпает на N-времени, по истечение заданого N-времени скрипт cron1 просыпается и
запускает скрипт cron2, аналогичные действия выполняет и скрипт cron2 - выполяняет некие действия,
засыпает и запускает скрипт cron1. В результате получаем пинг-понг между двумя скриптами или
псевдо-крон.
Пример1:
Напишем наш псевдо-крон, который будет записывать каждые 5 секунд в файл /tmp/cron.test
сообщение "Starting daemon (/home/user/mail.test)...и текущее время"
временную метку будем записывать для того,что бы мы могли убедиться,
что запись в файл происходит примерно каждые 5 секунд. Напомню, что оба файла должны иметь
права на запуск (-rwx------)
cron1
---------------------------------
#!/bin/bash
if [ -x /home/user/cron2]; then
times=`date`
echo "Starting daemon (/home/user/mail1.test)...$times" >> /tmp/cron.test
sleep 5
/home/user/cron2 nohup &
fi
cron2
---------------------------------
#!/bin/bash
if [ -x /home/user/cron1]; then
times=`date`
echo "Starting daemon (/home/user/mail2.test)...$times" >> /tmp/cron.test
sleep 5
/home/user/cron1 nohup &
fi
прокоментирую детали
if [ -x /home/user/cron2] -проверка что скрипт cron2 имеет права на запуск
times=`date` -присвоим переменной times значение командой date, date без параметров выводит дату
и время на стандартное устройство вывода stdout
символ >> -указывает что информация должна быть добавлена в конец файла /tmp/cron.test
sleep 5 -дает указание скрипту заснуть на 5 секунд
/home/user/cron1 nohup & -Запуск скрипта /home/user/cron1 в режиме игнорирования сигналов прерывания
и завершения, что предотвращает завершение работы команды даже если пользователь, запустивший скрипт,
вышел из системы. Если после команды не указан символ &, то она будет исполняться как процесс "переднего
плана".
Проверяем работу нашего псевдо-крона запуском скрипта ./cron1
в файле /tmp/cron.test появились записи, теперь даже если мы закроем рабочий терминал, наш псевдо-крон
будет продолжать работать и выполнять заложеные в нем действия.
Starting daemon1 (/home/user/mail1.test)...Птн Авг 6 01:56:01 YEKST 2004
Starting daemon1 (/home/user/mail2.test)...Птн Авг 6 01:56:06 YEKST 2004
Starting daemon1 (/home/user/mail1.test)...Птн Авг 6 01:56:12 YEKST 2004
Starting daemon1 (/home/user/mail2.test)...Птн Авг 6 01:56:17 YEKST 2004
Все работает. Запуская (периодически) команду ps -aux увидим, что PID процесса постоянно меняется
root 2723 0.0 0.5 4512 1356 pts/0 S 00:05 0:00 -bash
root 3980 0.7 0.4 4336 1076 ? S 01:10 0:00 /bin/bash /home/user/cron1 nohup
root 3988 0.0 0.2 3864 520 ? S 01:10 0:00 sleep 5
root 4026 3.0 0.4 4340 1080 ? S 01:11 0:00 /bin/bash /home/user/cron1 nohup
root 4034 0.0 0.2 3868 524 ? S 01:11 0:00 sleep 5
root 4035 0.0 0.2 2640 696 pts/0 R 01:11 0:00 ps -aux
Минус -плодятся процессы "Зомби" "Процессы-зомби" -это процессы, "родители" которых уже завершили работу.
Уничтожить такие процессы можно командой kill -9
т.е. уничтожить процесс по номеру не получится, для останова нашего псевдо-крона нужно просто удалить оба
файла cron1 и cron2
Способ №2
Другой способ с использованием одного скрипта, заключается в рекурсивном вызове скриптом самого себя
при этом PID процесса остается не изменным
скрипт cron_one
----------------
#!/bin/bash
if [ -x /home/user/cron_one ]; then
times=`date`
echo "Starting daemon (/home/user/cron_one)...$times" >> /tmp/cron.test
sleep 5
fi
exec $0
$0 - это название файла сценария, т.е командой exec $0 -скрипт снова и снова запускает сам себя
запускаем скрипт в фоне ./cron_one nohup &
в этом случае команда exec не порождает дочерний процесс!
P.S. если не требуется особая точность при запуске заданий по расписанию, то такой способ может
решить проблему smile но всегда остается шанс получить от админа по шее за такой подход к делу smile
автор: dinggo
 
Форум » WEB-мастеру » Учебник » Псевдо-крон
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Лучшие пользователи
Новые пользователи
Популярные темы
Недавно обновленные темы