Cron работает каждые 15 секунд

18

Не могли бы вы посоветовать мне, что писать, crontabчтобы он выполнял какую-то работу (для тестирования, которую я буду использовать /usr/bin/chromium-browser) каждые 15 секунд?

xralf
источник
Вместо crontab используйте другую систему управления событиями, например: модуль Perl Every.pm поможет вам в этом.
Nikhil Mulley

Ответы:

27

Вы не можете опускаться ниже 1 минуты детализации с помощью cron. То, что вы можете сделать, это каждую минуту запускать скрипт, который запускает вашу работу, ждет 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 секунд?

Жиль "ТАК - перестань быть злым"
источник
также может быть: for i in 1 2 3 4 ; do some_job & sleep 15; done(последний сон не повлияет на следующий запуск), но способ, которым вы это делаете, вероятно, лучше подходит для определения времени исходящей почты cronjob (отправленной сразу после последнего some_job, целых 15 секунд позже в мой вариант)
Оливье Дюлак
13

Другой подход, чем у других: запустите 4 cronjobs, каждый в шахматном порядке на 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-email.

Otheus
источник
Блестящий, хотя и повторяющийся.
Майк Корменди
1
Ницца. Если процесс выполняется долго, то следующий процесс, вероятно, также окажется на другом ядре. Не уверен, сможете ли вы сознательно установить сродство ядра для заданий Cron, но это может сделать этот подход еще лучше.
Тим
@ Хорошая мысль. Я обратился к этому несколько в редактировании.
Отей
2

Короче говоря, cron не настолько гранулирован со временем. Самый короткий период вы получите 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 секунд ...

rfelsburg
источник
У меня есть строка * * * * * /usr/bin/chromium-browserв crontab. Согласно инструкции, он должен запускаться каждую минуту, но ничего не работает.
xralf
Сложно ли написать такой сценарий? Должен ли я задать еще один вопрос или его можно написать здесь?
xralf
У заданий Cron нет терминала, поэтому я ожидаю сбоя браузера. Это может сделать это молча.
BillThor
Мои журналы cron находятся в / var / log / cron для производных от redhat, т.е. fedora, centos и т. д. Это также может помочь вам точно описать, что вы пытаетесь сделать, чтобы у людей была полная картина того, что происходит.
rfelsburg
1

В вашем crontab:

* * * *  /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
amphetamachine
источник
Когда я пишу ps aux | grep chromчерез минуту, я не вижу работающего браузера Chromium.
xralf
@xralf - скрипт выполняется не более нескольких секунд. Попробуйте поискать sleep.
амфетамина