Псевдо-крон

Автор: content Пятница, Апрель 11th, 2008 Нет комментариев

Рубрика: Интернет

Допустим у Вас есть 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. если не требуется особая точность при запуске заданий по расписанию, то такой способ может
решить проблему :) но всегда остается шанс получить от админа по шее за такой подход к делу :)
автор: dinggo

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты