Как конвертировать cron в демона - PullRequest
3 голосов
/ 28 ноября 2011

У меня есть скрипт оболочки cron, который вызывает хранимую процедуру для выполнения какой-либо операции. Я хочу знать, как я могу изменить этот cron на демона.

Вот что у меня есть.

    #!/bin/ksh
    # @(#)abc.sh    


    . /somedir/env/some_profile
    JOBNAME=`basename $0`
    LOG_DIR=$PROJHOME/log
    LOG_FILE=$LOG_DIR/process_abc.log

    function usage
    {
      echo "${JOBNAME}: Usage: ${JOBNAME}"
      echo "Exiting..."
      echo "process_abc ended ***UNSUCCESSFULLY*** at `date`" | tee -a $LOG_FILE
      echo ""  | tee -a $LOG_FILE
      exit 1
    }

Не могли бы вы помочь. Ваша помощь будет оценена.

Спасибо

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

вы можете просто запустить его из bash

SLEEP_INTERVAL=3600
(echo $$ > /var/run/script-runner.sh.pid && while :; do script.sh ; sleep $SLEEP_INTERVAL ; done) &

или вы можете сделать тот же цикл внутри скрипта

trap "function_that_runs_everything" HUP
echo $$ > /var/run/script.sh.pid
while :; do
    function_that_runs_everything
    sleep $SLEEP_INTERVAL #or sleep forever just waiting for SIGHUP
done

таким образом вы также можете принудительно выполнить внутреннюю функциюизвне

kill -1 `cat /var/run/script.sh.pid`

также я бы предложил переписать:

if [ `/usr/ucb/ps -auxww | grep $JOBNAME | grep "sh -c" | grep -v grep  | wc -l` -gt 1 ]

, чтобы использовать $$ (текущий pid оболочки) и создать файл pid

pseudocode:
PIDFILE=/var/run/`basename $0`.pid
if $PIDFILE exists
    log and exit
else
    echo $$ > $PIDFILE

...
run
...
rm -f $PIDFILE

(не забудьте удалить pid-файл при сбое при выходе)

0 голосов
/ 08 декабря 2011

Давайте подумаем о том, что делает демон. Он сидит и ждет событий, а затем отвечает на них. Это отличается от задания cron, которое просто выполняется по расписанию.

Очень легко сделать что-то, что будет работать, подождать, пока что-то произойдет, сделать что-нибудь, когда это произойдет, а затем продолжать ждать, пока что-то случится снова. Все, что вам действительно нужно, это обертка для существующего сценария оболочки. Оболочка должна распознавать условия события и запускать скрипт, который вы в противном случае запускали бы в cron.

Оболочка может быть такой же простой, как скрипт оболочки, который запускается заданием cron по специальной строке "@reboot" (подробности man 5 crontab). Запустите скрипт-обертку напрямую или внутри GNU Screen, чтобы вы могли присоединиться к нему в будущем и посмотреть, как он работает (если вы не включили обработку ошибок). Чтобы быть умным, следует также избегать запуска существующего сценария более одного раза за раз (то есть дать ему файл блокировки), хотя вы уже выполняете это в своем сценарии ksh, выше.

Вместо бесконечной петли Джекдо со сном, выше, вы хотите распознать событие , которое запустит ваш скрипт. Например, должен ли он выполняться, когда файл с именем "somefile" загружается с использованием vsftpd? Тогда:

#!/bin/sh
tail -F /var/log/vsftpd.log | while read line; do
  case "$line" in
    *UPLOAD*/somefile",*)
      /path/to/abc.sh
      ;;
  esac
done

Это хакерское решение на полпути, которое не включает в себя функции запуска / остановки, но оно поможет вам.

Действительно, эта обертка должна заботиться о блокировке, чтобы избежать многократного запуска abc.sh, и должна поддерживать свой собственный файл pid, чтобы он мог быть убит обработчиком в /etc/init.d/ (Linux) или / usr /local/etc/rc.d/ (FreeBSD).

0 голосов
/ 06 декабря 2011

Почему бы вам просто не демонизировать его с помощью Fat Controller?

fat-controller.sourceforge.net

...