У мене є сценарій, який потрібно запускати кожні п’ять секунд. Я знаю, що cron
можна виконувати завдання щохвилини, але чи є спосіб запустити щось щосекунди?
sleep 5
паузи (можливо, в циклі) на 5 секунд) ...?
У мене є сценарій, який потрібно запускати кожні п’ять секунд. Я знаю, що cron
можна виконувати завдання щохвилини, але чи є спосіб запустити щось щосекунди?
sleep 5
паузи (можливо, в циклі) на 5 секунд) ...?
Відповіді:
Cron дозволяє лише мінімум одну хвилину. Що ви можете зробити, це написати сценарій оболонки з нескінченним циклом, який виконує ваше завдання, а потім спить протягом 5 секунд. Таким чином ваше завдання виконується більш-менш кожні 5 секунд, залежно від того, скільки часу займає сама задача.
#!/bin/bash
while true; do
# Do something
sleep 5;
done
Ви можете створити my-task.sh
файл із вмістом вище та запустити його sh my-task.sh
. За бажанням ви можете налаштувати його supervisor
як сервіс, щоб він запускався, коли система завантажується тощо.
Це дійсно звучить так, ніби ти робиш щось, що, мабуть, не повинен робити. Це відчуває себе неправильно .
Ви можете мати cron
сценарій початкового завдання щохвилини, який таким чином запускає 12 фонових процесів:
* * * * * ~/dostuff.sh
dostuff.sh
:
(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &
Але моє запитання: що на EARTH ви могли б робити, що потрібно запускати кожні 5 секунд?
/media
каталог на диск, я підключаюсь до usb для автоматичного резервного копіювання ...
What on EARTH
- статистика, збирання сміття, синхронізація файлів, статус в Інтернеті, ви його називаєте.
Просто використовуйте цикл:
while true ; do ./your-script & sleep 5; done
Це запустить ваш сценарій як фонове завдання, спати протягом 5 секунд, а потім знову циклічити. Ви можете використовувати Ctrl-C, щоб перервати його, або використовувати будь-яку іншу умову замість true
, наприклад, ! test -f /tmp/stop-my-script
лише для циклу, поки файл /tmp/stop-my-script
не існує.
bash: syntax error near unexpected token ';'
, тому я його вийняв. У мене баш 4.3.11. Моя команда працює швидко, тому це нормально, якщо вона працює на передньому плані.
./your-script
було бігати у фоновому режимі (під час 5-секундного сну), ви можете тримати, &
але кинути ;
. Що &
стосується мети розділення команд, зайве (і, мабуть, не дозволено) мати ;
після нього в одному рядку. Інший спосіб - записати цикл у декількох рядках (з розривом рядка після &
та, за бажанням, також розривами рядків після do
і перед done
). Оскільки ;
після &
видається помилка друку, я її видалив. синюватий: Будь ласка, не соромтесь покласти ;
спинку, якщо ви цього дуже хочете; якщо так, я пропоную також додати пояснення.
Ви можете використовувати пакет GNU mcron , альтернативу "Vixie cron".
http://www.gnu.org/software/mcron/manual/mcron.html#Top
"Легко дозволяють задавати більш точні часові точки, тобто секунди. В принципі це може бути розширено до мікросекунд, але це не реалізовано."
mcron
вимагає sendmail
встановлення та активації за замовчуванням. як її відключити?
Мінімальна конфігурація в кроні - це хвилин, ви не можете встановити її протягом 5 секунд. Ви можете використовувати кварц, який дозволяє секунди. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
Використовуйте кактуси для моніторингу маршрутизатора та комутатора, але Cron дозволяє лише мінімум одну хвилину, тож якщо один порт / пристрій вниз, попередження не минуло до двох хвилин.
Ви можете використовувати таймерний блок SystemD, який запускатиме послугу, яку ви налаштували робити те, що хочете, кожні 5 секунд.
Припустимо, ваш сервісний блок викликається mystuff.service
та встановлений у ньому /etc/systemd/system
(перегляньте служби користувачів SystemD, якщо ви хочете замінити кронтаб користувача), тоді ви можете написати таймер, щоб запустити службу під час завантаження, а потім кожні 5 секунд:
/etc/systemd/system/mystuff.timer
[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target
Потім перезавантажте системну конфігурацію, увімкніть блок таймера та запустіть його.
Я робив подібні речі дуже успішно (і кінцевий результат працює за тиждень, поки машина не перезавантажиться). Щодо того, що я робив зараз, оновлення інформації та введення її в кеш - оновлення кожні 10 секунд.
#!/bin/sh
SLEEP=5
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# echo and restart...
exec $0
'Exec $ 0' перезавантажує сценарій, але замінює запущений сценарій. Спочатку його можна починати з рядка crontab '@reboot'.
while
цикл замість того, щоб повторно перезапускати сценарій?