Робота з Cron кожні 15 секунд


18

Чи можете ви порадити мені, що писати, crontabщоб вона виконувала якусь роботу (для тестування я буду використовувати /usr/bin/chromium-browser) кожні 15 секунд?


Замість crontab покладайтеся на якусь іншу систему управління подіями, наприклад: модуль Every.pm Perl допоможе вам це зробити.
Нікхіл Маллі

Відповіді:


27

З кроном ви не можете піти нижче рівня хвилини. Що ви можете зробити - це щохвилини запускати сценарій, який виконує вашу роботу, чекає 15 секунд і повторюється. Наступний рядок crontab розпочнеться some_jobкожні 15 секунд.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

Цей сценарій передбачає, що робота ніколи не займе більше 15 секунд. Наступний трохи складніший сценарій допомагає не запускати наступний екземпляр, якщо для запуску потрібно було занадто багато часу. Він покладається на dateпідтримку %sформату (наприклад, GNU або Busybox, тому ви будете добре в Linux). Якщо ви покладете його безпосередньо в crontab, зверніть увагу, що %символи повинні бути записані як \%у рядку crontab.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Однак зауважу, що якщо вам потрібно працювати так часто, як кожні 15 секунд, Cron - це, мабуть, неправильний підхід. Незважаючи на те, що унісокси є добрими при короткочасних процесах, затрати на запуск програми кожні 15 секунд можуть бути незначними (залежно від того, наскільки вимоглива програма). Ви не можете запускати свою програму весь час і чи потрібно їй виконувати завдання кожні 15 секунд?


також може бути: бо я в 1 2 3 4 ; do some_job & sleep 15; done(останній сон не вплине на наступний запуск), але те, як ви це зробите, напевно, краще для термінів вихідної пошти Cronjob (надіслано одразу після останнього some_job, в намірі 15s пізніше у мій варіант)
Олів'є Дулак


13

Інший підхід, ніж інші: виконайте 4 крона, кожен з яких проводиться по 15 секунд:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Щоб робота не заважала собі, ми обмежуємо її час роботи до 15 секунд через GNU coreutils ' timeoutдля кожної роботи. Однак зауважте, що якщо завдання не виходить належним чином закінчитися негайно наприкінці 15-х, у вас все-таки можуть виникнути проблеми. Детальну інформацію про те, як вирішити, якщо це стає проблемою, див. У посібнику з командами. Також зауважте, якщо команда займає більше 15 секунд, а час очікування вбиває її, ви отримаєте ненульовий статус виходу, який спричинить електронну пошту cronjob.


Блискучий, хоч і повторюваний.
Майк Корменді

1
Приємно. Якщо процес триває довго, наступний процес, ймовірно, закінчиться і на іншому ядрі. Не впевнений, чи можна навмисно встановити спорідненість основної роботи для Cron, але це може зробити цей підхід ще кращим.
Тім

@Tim гарний момент. Я дещо звернувся до цього в редакції.
Отей

2

Коротше кажучи, крон не такий вже й гранульований із часом. Найкоротший термін, який ви отримаєте, - 1 хв.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

Однак ви можете написати сценарій, який працюватиме кожні 15 секунд ...


У мене є рядок * * * * * /usr/bin/chromium-browserу crontab. Відповідно до посібника, він повинен працювати щохвилини, але нічого не працює.
xralf

Чи важко написати такий сценарій? Чи варто задати інше запитання чи це можна було написати тут?
xralf

У роботах Cron немає терміналу, тому я б очікував, що браузер вийде з ладу. Це може робити мовчки.
BillThor

Мої журнали cron знаходяться в / var / log / cron для похідних redhat, тобто. fedora, centos тощо. Це також може допомогти вам описати, що саме ви намагаєтеся зробити, щоб люди мали повну картину того, що відбувається.
rfelsburg

1

У вашому кроні:

* * * *  /usr/bin/chromium-browser_starter

Потім у /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait

Коли я пишу ps aux | grep chromчерез хвилину, я не бачу роботи браузера з хромом.
xralf

@xralf - сценарій виконується лише протягом декількох секунд. Спробуйте привітатися sleep.
амфетамахін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.