Чи можете ви порадити мені, що писати, crontab
щоб вона виконувала якусь роботу (для тестування я буду використовувати /usr/bin/chromium-browser
) кожні 15 секунд?
Чи можете ви порадити мені, що писати, crontab
щоб вона виконувала якусь роботу (для тестування я буду використовувати /usr/bin/chromium-browser
) кожні 15 секунд?
Відповіді:
З кроном ви не можете піти нижче рівня хвилини. Що ви можете зробити - це щохвилини запускати сценарій, який виконує вашу роботу, чекає 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 пізніше у мій варіант)
Інший підхід, ніж інші: виконайте 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 хв.
# .---------------- 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. Відповідно до посібника, він повинен працювати щохвилини, але нічого не працює.
У вашому кроні:
* * * * /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
через хвилину, я не бачу роботи браузера з хромом.
sleep
.