Псевдо-крон --------------- Допустим у Вас есть 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