Как запускать скрипты каждые 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.