Чи можна запускати роботу cron кожні 30 секунд без команди сну?
Чи можна запускати роботу cron кожні 30 секунд без команди сну?
Відповіді:
Якщо ваше завдання потрібно виконувати так часто, cron - це неправильний інструмент. Крім того, що він просто не запускає завдання так часто, ви також ризикуєте отримати серйозні проблеми, якщо робота займе більше часу, ніж інтервал між запусками. Перепишіть своє завдання, щоб демонструвати та запускати послідовно, після чого запускайте його з крону (якщо переконайтеся, що воно не буде повторно запущено, якщо воно вже працює).
run-one
для того, щоб програма / навіть скрипт PHP не запускала копію екземпляра. sudo apt-get install run-one
і зателефонуйте доrun-one <normal command>
Кандидат за найбільш творчі зловживання командою Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Якщо yourprog
складається з:
date +%M.%S.%N >> yourprog.out
то yourprog.out
може виглядати так:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
що вказує на досить хороший рівень точності.
Ось пояснення частин команди:
nohup
- Це утримує команду, яка слідує за нею, watch
у цьому випадку не виходить, коли термінал виходить.watch
- Ця програма виконує команду кілька разів. Зазвичай перший скрипт виводу з команди відображається щоразу, коли watch
виконується команда.-n 30
- Інтервал, через який потрібно запустити команду. У цьому випадку це кожні тридцять секунд.--precise
- Без цієї опції, watch
запускає команду через інтервал секунд. З його допомогою кожен запуск команди починається на проміжку, якщо це можливо. Якби ця опція не була вказана в прикладі, час набиратиметься пізніше і пізніше більше ніж на 30 секунд через час, необхідний для запуску та виконання команди ( yourprog
).yourprog
- Програма або командний рядок для watch
виконання. Якщо командний рядок містить символи, спеціальні для оболонки (наприклад, пробіл чи крапка з комою), його потрібно буде цитувати.>/dev/null
- Чим більше, ніж перенаправляє висновок команди керує watch
в файл /dev/null
. Цей файл відкидає будь-які записані в нього дані. Це запобігає запису виводу на екран або, оскільки nohup
використовується, запобігає надсиланню виводу у файл, що називається nohup.out
.&
- watch
Команда виконується у фоновому режимі, а управління повертається до терміналу чи батьківського процесу.Зауважте nohup
, що перенаправлення виводу та &
оператор керування фоном не є специфічними для watch
.
Ось пояснення прикладу yourprog
сценарію:
date
- Виводить поточну дату та / або час. Він також може їх встановити.+%M.%S.%N
- Це визначає вихідний формат для date
використання. %M
- це поточна хвилина, %S
- це поточна секунда і %N
- це поточна наносекунда.>> yourprog.out
- Це перенаправляє вихід date
команди в файл, який називається yourprog.out
. Удвічі більший, ніж приводить, що вихід буде доданий у файл під час виклику, а не попередній вміст, що перезаписується.Редагувати :
Можливо, інша річ, яку можна зловживати (або, можливо, це законно використовувати), - це системні таймери.
Див Systemd / Таймери в якості заміни хрон і Cron проти Systemd таймерів .
Я спробую опублікувати приклад найближчим часом.
&
Змушує команду працювати у фоновому режимі, повертаючи управління в командний рядок негайно. Використання nohup
команди змушує фоновий процес (в даному випадку watch
) ігнорувати сигнал зависання, який надсилається при виході оболонки, наприклад, коли ви закриваєте термінал. ...
>/dev/null
призводить до того, що вихід буде відкинутий і запобігає створенню nohup.out
файлу, який інакше був би створений, коли стандартний вихід є терміналом.
sleep
, вам потрібно буде написати цикл, щоб процес повторився ( watch
чи це повторюється для вас, як це робиться cron
). Вам все одно знадобиться nohup
і &
. Додатковою проблемою sleep
може стати зменшення часу. --precise
Варіант watch
дозволяє уникнути цього. Без нього або при використанні sleep
в циклі, тимчасовий інтервал має час, необхідний для додавання команд або сценарію до нього, так що кожен запуск стає пізніше і пізніше, ніж ...
Cron створений для того, щоб прокидатися щохвилини, тому неможливо обійтися без злому, наприклад сну, як ви згадали.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Не забудьте написати щось у вашу програму, щоб воно виходило, якщо попередній екземпляр вже запущений.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Звичайно, це все ще залишає дуже малу можливість для відмови, тому шукайте в Google для кращого рішення, застосовного до вашого оточення.
without a sleep command
Це можна зробити за допомогою програмного забезпечення сторонніх виробників.
Варіант, який добре працює для мене, - частота-cron
Це дозволяє отримати мілісекундну точність і дає можливість відкласти наступне виконання до тих пір, поки не закінчиться поточне.
У мене виникнуть кілька проблем:
(1) іноді система стає зайнятою і не може починати справи точно на 30 секунді, цілком можливо, що в той же час, коли ви виконуєте одну роботу, з’явиться інша робота, і тоді у вас є 2 (або більше) завдання, які роблять те саме річ. Залежно від сценарію, тут може бути якесь суттєве втручання. Таким чином, кодування в такому сценарії повинно містити деякий код, щоб гарантувати, що одночасно працює лише один екземпляр даного сценарію.
(2) Сценарій, можливо, може мати великі накладні витрати та використовувати більше системних ресурсів, ніж ви могли б хотіти. Це справедливо, якщо ви змагаєтесь проти багатьох інших системних заходів.
Таким чином, як висловився один плакат, в цьому випадку я серйозно розглядаю можливість введення демона, який працює з додатковими процесами, щоб забезпечити його продовження роботи, якщо це має критичне значення для ваших операцій.
запис у крон:
* * * * * flock -w0 /path/to/script /path/to/script
сценарій:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
або
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
команди дозволяє уникнути запуску скрипта кількома екземплярами за один і той же час. Це може бути дуже важливим у більшості випадків.flock
і watch
команди доступні для більшості встановлень Linuxwatch
командуРішення, якщо це для вашого власного сценарію або якщо ви можете його обернути:
Менше болить голова, ніж будувати та контролювати демон.
* Якщо ви використовуєте PHP, запам'ятайте clearstatcache ().