вызывать функцию через определенные промежутки времени в Linux - PullRequest
1 голос
/ 27 января 2010

Как лучше всего вызывать функцию внутри демона Linux через определенные промежутки времени и определенное время (например, в 12:00 каждый день, вызывайте эту функцию). Я имею в виду не вызов процесса с помощью crontab, а функцию внутри долго работающего демона.

Спасибо

Ответы [ 4 ]

1 голос
/ 27 января 2010

Из ваших тегов вопросов я понимаю, что вы запускаете демон оболочки. Поэтому я предлагаю использовать crontab, так как он уже ждет, чтобы сигнализировать вашему демону.

В вашем демоне оболочки вам нужен обработчик сигнала

   handler() {
      echo "$(date): doing something special" >> $LOG
   }

вы должны перехватить сигнал, в данном примере SIGALRM

    trap handler ALRM

и в вашем crontab отправьте сигнал, предполагая, что ваш демон - daemon.sh

   0 0 * * * killall -s SIGALRM daemon.sh
1 голос
/ 27 января 2010

используйте settimer с ITIMER_REAL и вызовите обработчик SIGALARM для вашей функции.

0 голосов
/ 27 января 2010

Мой любимый трюк:

  • спать и бодрствовать каждые N-е секунды (лично я предпочитаю каждую секунду или каждые 10 секунд)
  • когда проснешься, проверь время и проверь, нужно ли мне что-то запускать
  • промыть, повторить ...

Как вы это сделаете, зависит от вашего языка. В tcl я бы сделал что-то вроде:

proc scheduler {} {
    global task_list
    set now [clock format [clock seconds] -format "%H:%M"]

    foreach task $task_list {
       lassign $task_list time task
       if {$time == $now} {
           apply $task
       }
    }
    after 1000 scheduler ;# repeat after 1 second
}

scheduler ;# GO!
0 голосов
/ 27 января 2010

Сравните текущее время со временем, которое вы должны работать, и если оно позже, чем время, а затем сбросьте время.

...