Как запускать скрипты каждые 5 секунд?


66

У меня есть скрипт, который нужно запускать каждые пять секунд. Я знаю, что cronможет выполнять задачи по минутам, но есть ли способ запускать что-то каждую секунду?


3
Какую проблему ты пытаешься решить? Вы уверены, что cron - правильное решение?
андол

1
Я знаю, что cron - это не правильное решение. Я говорил, что это не было в вопросе. Пожалуйста, прочитайте. Я пытаюсь заставить скрипт запускаться каждые 5 секунд.
myusuf3

2
Извините, наверное, я неправильно понял вопрос. Тем не менее, все еще интересно, если вы пытаетесь решить правильную проблему.
андол

Для людей, которые приходят сюда и ищут, как запускать что-то каждые 5 секунд. Вместо этого я настоятельно рекомендую вам взглянуть на обучение программированию в реальном времени с помощью таких инструментов, как socket.io.
Брэндон Бертельсен

Вы обнаружили команду bash sleep? sleep 5паузы (возможно, в пределах цикла) на 5 секунд) ...?
SDsolar

Ответы:


64

Крон позволяет только минимум одну минуту. Что вы можете сделать, это написать сценарий оболочки с бесконечным циклом, который выполняет вашу задачу, а затем спит в течение 5 секунд. Таким образом, ваша задача будет выполняться более или менее каждые 5 секунд, в зависимости от того, сколько времени занимает сама задача.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Вы можете создать my-task.shфайл с содержимым выше и запустить его с помощью sh my-task.sh. При желании вы можете настроить его supervisorкак службу, чтобы он запускался при загрузке системы и т. Д.

Это действительно звучит так, как будто вы делаете что-то, чего, вероятно, не следует делать. Это чувствует себя неправильно .


Для использования в скребках на основе PHP может потребоваться запуск cron каждые 5 или менее секунд.
Равиш Кумар

На самом деле чувствует себя не так. Если вы включите его в задание cron, то у вас будут повторяющиеся задания каждую минуту. Через час будет выполняться 60 заданий каждые 5 секунд. Если вы не включите в работу cron, вы, возможно, не сможете знать, как ее остановить, или даже знать, что она существует.
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) &

Мой вопрос, однако, таков: что на ЗЕМЛЕ вы могли бы делать, чтобы запускаться каждые 5 секунд?


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

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

3
Ссылка на внешний API для данных почти в реальном времени. Выполнение запроса каждые 5 секунд НАМНОГО лучше, чем при каждом просмотре страницы.
Сергей Кудрявцев

1
Что если crontab дважды выполнит файл dostuff.sh? Например, на 55-й секунде сценарий выполняется, но еще не завершен, но cron снова вызывает сценарий, что произойдет?
TomSawyer

2
ЭТО ПЛОХО! Он потенциально запускает сценарий более одного раза за раз (если это занимает больше 5 секунд), что может привести к состоянию гонки в любых (даже временных) файлах, к которым получен доступ. НЕ ДЕЛАЙТЕ ЭТОГО, если выполнение одного и того же действия дважды в одно и то же время может вызвать проблемы! (И это обычно будет!)
Нонни Мус

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 ';', поэтому я вынул его. У меня bash 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установки и активации по умолчанию. как это отключить?
ихсан

2

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


Кажется, Кварц не с открытым исходным кодом. Это верно?
txwikinger

Имеет версию с открытым исходным кодом. У него нет страницы, а просто перейдите на страницу загрузки. Вам не нужно заполнять форму, просто нажмите, чтобы загрузить меня.
Коди Харлоу

по-видимому, с открытым исходным кодом по крайней мере 2018 года. github.com/quartz-scheduler/quartz
dogmatic69

2

Используйте cacti для мониторинга маршрутизатора и коммутатора, но Cron позволяет использовать не менее одной минуты, поэтому, если один порт / устройство отключен, предупреждения не будет, пока не пройдут две минуты.


1
Я рекомендую отредактировать этот ответ, чтобы расширить его конкретными сведениями о том, как это сделать. (См. Также Как написать хороший ответ? Для общего совета о том, какие ответы считаются наиболее ценными в Ask Ubuntu.)
Дэвид Фёрстер

2

Вы можете использовать модуль таймера SystemD, который будет запускать службу - которую вы настроили на выполнение того, что вы хотите - каждые 5 секунд.

Предположим, что ваш сервисный модуль вызывается mystuff.serviceи устанавливается в /etc/systemd/system(проверьте пользовательские сервисы SystemD, если вы хотите заменить crontab пользователя), затем вы можете написать таймерный блок для запуска сервиса во время загрузки, а затем каждые 5 секунд, например:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Затем перезагрузите конфигурацию systemd, включите таймер и запустите его.


1
Это лучшее решение, единственным недостатком которого является то, что cron намного проще просматривать и настраивать. SystemD - это боль, и она начинается со своей структуры каталогов. Все еще лучший для 5-секундного интервала
Джон

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

@ Брукс: да, моя плохая - плохая копия и вставка на моей стороне. Исправлена.
Гусс

Спасибо ... рад знать, что я не сумасшедший, пока изучаю systemd :)
Брукс

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» перезапускает скрипт, но заменяет запущенный скрипт. Первоначально он может быть запущен с помощью строки @reboot crontab.


8
Почему бы не использовать whileцикл вместо повторного запуска сценария?
Дэвид З
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.