Як запускати сценарії кожні 5 секунд?


66

У мене є сценарій, який потрібно запускати кожні п’ять секунд. Я знаю, що cronможна виконувати завдання щохвилини, але чи є спосіб запустити щось щосекунди?


3
Яку проблему ви намагаєтеся вирішити? Ви впевнені, що крон - це правильне рішення?
andol

1
Я знаю, що Cron не є правильним рішенням. Я говорив, що про це не йдеться. Будь ласка, прочитайте. Я намагаюся запускати сценарій кожні 5 секунд.
myusuf3

2
Вибачте, напевно, я зрозумів, що питання було неправильним. Але все ще цікаво, чи намагаєтесь ви вирішити правильну проблему.
andol

Люди, які приходять сюди, дивляться, як запустити щось кожні 5 секунд. Настійно рекомендую замість цього вивчити, як програмувати в режимі реального часу за допомогою таких інструментів, як socket.io.
Брендон Бертелсен

Ви виявили команду баш-сну? sleep 5паузи (можливо, в циклі) на 5 секунд) ...?
SDsolar

Відповіді:


64

Cron дозволяє лише мінімум одну хвилину. Що ви можете зробити, це написати сценарій оболонки з нескінченним циклом, який виконує ваше завдання, а потім спить протягом 5 секунд. Таким чином ваше завдання виконується більш-менш кожні 5 секунд, залежно від того, скільки часу займає сама задача.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Ви можете створити my-task.shфайл із вмістом вище та запустити його sh my-task.sh. За бажанням ви можете налаштувати його supervisorяк сервіс, щоб він запускався, коли система завантажується тощо.

Це дійсно звучить так, ніби ти робиш щось, що, мабуть, не повинен робити. Це відчуває себе неправильно .


Для використання в скреперах на основі PHP може знадобитися крон, що працює кожні 5 або навіть менше секунд.
Ravish Kumar

Дійсно відчуває себе неправильно. Якщо ви включите його в роботу з кроном, то у вас будуть щохвилини перекриваються завдання. Через годину 60 завдань розпочнеться кожні 5 секунд. Якщо ви не включите у роботу з кроном, ну, можливо, ви не зможете знати, як її зупинити, або навіть знати, що вона існує.
SeF

35

Ви можете мати 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 секунд?


1
Ну, це мені було в нагоді, коли я зробив сценарій, який неодноразово перевіряє /mediaкаталог на диск, я підключаюсь до usb для автоматичного резервного копіювання ...
VF1

32
What on EARTH- статистика, збирання сміття, синхронізація файлів, статус в Інтернеті, ви його називаєте.
ruX

3
Посилання на зовнішній API для даних у реальному часі. Запуск запиту кожні 5 секунд набагато краще, ніж робити це на кожному перегляді сторінки.
Сергій Кудрявцев

1
Що робити, якщо crontab двічі виконує файл dostuff.sh? Наприклад, на 55-й секунді сценарій виконується, але ще не закінчений, але cron знову викликає сценарій, що буде?
TomSawyer

2
ЦЕ ПОГАНО! Він потенційно запускає сценарій більше одного разу (якщо трапляється більше 5 секунд), що може призвести до перегоночного стану в будь-яких (навіть тимчасових) файлах, до яких звертається. НЕ робіть цього, якщо виконання однієї і тієї ж речі двічі одночасно може спричинити проблеми! (І це зазвичай буде!)
Nonny Moose

27

Просто використовуйте цикл:

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. Моя команда працює швидко, тому це нормально, якщо вона працює на передньому плані.
Тайлер Колліє

1
@TylerCollier Якщо вам потрібно ./your-scriptбуло бігати у фоновому режимі (під час 5-секундного сну), ви можете тримати, &але кинути ;. Що &стосується мети розділення команд, зайве (і, мабуть, не дозволено) мати ;після нього в одному рядку. Інший спосіб - записати цикл у декількох рядках (з розривом рядка після &та, за бажанням, також розривами рядків після doі перед done). Оскільки ;після &видається помилка друку, я її видалив. синюватий: Будь ласка, не соромтесь покласти ;спинку, якщо ви цього дуже хочете; якщо так, я пропоную також додати пояснення.
Елія Каган

@EliahKagan FWIW, він працює на Zsh (помилка синтаксису), але це насправді не потрібно. Дякуємо за редагування!
синенький

10

Ви можете використовувати пакет GNU mcron , альтернативу "Vixie cron".

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Легко дозволяють задавати більш точні часові точки, тобто секунди. В принципі це може бути розширено до мікросекунд, але це не реалізовано."


Саме це я і шукав. Дякую!
SDsolar

Будь ласка, опублікуйте це як відповідь на моє запитання тут: askubuntu.com/questions/922216/…, щоб я міг прийняти вашу відповідь.
SDsolar



mcronвимагає sendmailвстановлення та активації за замовчуванням. як її відключити?
ihsan

2

Мінімальна конфігурація в кроні - це хвилин, ви не можете встановити її протягом 5 секунд. Ви можете використовувати кварц, який дозволяє секунди. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


Здається, кварц не є відкритим кодом. Це правильно?
txwikinger

Він має відкриту версію. На ній немає сторінки, а просто перейдіть на сторінку завантаження. Вам не потрібно заповнювати форму, просто натисніть взяти мене до завантаження.
Коді Харлоу

здається, з відкритим вихідним кодом , як , по крайней мере , 2018. github.com/quartz-scheduler/quartz
dogmatic69

2

Використовуйте кактуси для моніторингу маршрутизатора та комутатора, але Cron дозволяє лише мінімум одну хвилину, тож якщо один порт / пристрій вниз, попередження не минуло до двох хвилин.


1
Рекомендую відредагувати цю відповідь, щоб розширити її конкретними деталями про те, як це зробити. (Див. Також Як я можу написати гарну відповідь? Для загальних порад про те, які типи відповідей вважаються найціннішими на Ask Ubuntu.)
Девід Фоерстер,

2

Ви можете використовувати таймерний блок 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

Потім перезавантажте системну конфігурацію, увімкніть блок таймера та запустіть його.


1
Це найкраще рішення. Єдиним недоліком є ​​те, що cron набагато простіше переглянути і налаштувати. SystemD - це біль, і вона починається зі своєї структури каталогів. Все-таки найкращий за 5-секундний інтервал
Джон

Чи не буде вказаний вище фрагмент у /etc/systemd/system/mystuff.timer замість mystuff.service?
Брукс

@Brooks: так, моя погана - погана копія та вставка на мою сторону. Виправлено.
Гасс

Дякую ... рада знати, що я не божевільна, коли я навчаюсь системно :)
Брукс

1

Я робив подібні речі дуже успішно (і кінцевий результат працює за тиждень, поки машина не перезавантажиться). Щодо того, що я робив зараз, оновлення інформації та введення її в кеш - оновлення кожні 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'.


8
Чому б не використовувати whileцикл замість того, щоб повторно перезапускати сценарій?
David Z
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.