Не могли бы вы посоветовать мне, что писать, crontab
чтобы он выполнял какую-то работу (для тестирования, которую я буду использовать /usr/bin/chromium-browser
) каждые 15 секунд?
Не могли бы вы посоветовать мне, что писать, crontab
чтобы он выполнял какую-то работу (для тестирования, которую я буду использовать /usr/bin/chromium-browser
) каждые 15 секунд?
Ответы:
Вы не можете опускаться ниже 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 секунд?
1 2 3 4 ; do some_job & sleep 15; done
(последний сон не повлияет на следующий запуск), но способ, которым вы это делаете, вероятно, лучше подходит для определения времени исходящей почты cronjob (отправленной сразу после последнего some_job, целых 15 секунд позже в мой вариант)
Другой подход, чем у других: запустите 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.
Короче говоря, 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 секунд ...
* * * * * /usr/bin/chromium-browser
в crontab. Согласно инструкции, он должен запускаться каждую минуту, но ничего не работает.
В вашем 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
ps aux | grep chrom
через минуту, я не вижу работающего браузера Chromium.
sleep
.