У меня есть скрипт, который нужно запускать каждые пять секунд. Я знаю, что cronможет выполнять задачи по минутам, но есть ли способ запускать что-то каждую секунду?
Какую проблему ты пытаешься решить? Вы уверены, что cron - правильное решение?
андол
1
Я знаю, что cron - это не правильное решение. Я говорил, что это не было в вопросе. Пожалуйста, прочитайте. Я пытаюсь заставить скрипт запускаться каждые 5 секунд.
myusuf3
2
Извините, наверное, я неправильно понял вопрос. Тем не менее, все еще интересно, если вы пытаетесь решить правильную проблему.
андол
Для людей, которые приходят сюда и ищут, как запускать что-то каждые 5 секунд. Вместо этого я настоятельно рекомендую вам взглянуть на обучение программированию в реальном времени с помощью таких инструментов, как socket.io.
Брэндон Бертельсен
Вы обнаружили команду bash sleep? sleep 5паузы (возможно, в пределах цикла) на 5 секунд) ...?
SDsolar
Ответы:
64
Крон позволяет только минимум одну минуту. Что вы можете сделать, это написать сценарий оболочки с бесконечным циклом, который выполняет вашу задачу, а затем спит в течение 5 секунд. Таким образом, ваша задача будет выполняться более или менее каждые 5 секунд, в зависимости от того, сколько времени занимает сама задача.
#!/bin/bashwhile 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 фоновых процессов, таким образом:
Ну, это пригодилось мне, когда я создал скрипт, который многократно проверяет /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".
Кажется, Кварц не с открытым исходным кодом. Это верно?
txwikinger
Имеет версию с открытым исходным кодом. У него нет страницы, а просто перейдите на страницу загрузки. Вам не нужно заполнять форму, просто нажмите, чтобы загрузить меня.
Используйте cacti для мониторинга маршрутизатора и коммутатора, но Cron позволяет использовать не менее одной минуты, поэтому, если один порт / устройство отключен, предупреждения не будет, пока не пройдут две минуты.
Я рекомендую отредактировать этот ответ, чтобы расширить его конкретными сведениями о том, как это сделать. (См. Также Как написать хороший ответ? Для общего совета о том, какие ответы считаются наиболее ценными в Ask Ubuntu.)
Дэвид Фёрстер
2
Вы можете использовать модуль таймера SystemD, который будет запускать службу - которую вы настроили на выполнение того, что вы хотите - каждые 5 секунд.
Предположим, что ваш сервисный модуль вызывается mystuff.serviceи устанавливается в /etc/systemd/system(проверьте пользовательские сервисы SystemD, если вы хотите заменить crontab пользователя), затем вы можете написать таймерный блок для запуска сервиса во время загрузки, а затем каждые 5 секунд, например:
Это лучшее решение, единственным недостатком которого является то, что 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.
sleep 5
паузы (возможно, в пределах цикла) на 5 секунд) ...?Ответы:
Крон позволяет только минимум одну минуту. Что вы можете сделать, это написать сценарий оболочки с бесконечным циклом, который выполняет вашу задачу, а затем спит в течение 5 секунд. Таким образом, ваша задача будет выполняться более или менее каждые 5 секунд, в зависимости от того, сколько времени занимает сама задача.
Вы можете создать
my-task.sh
файл с содержимым выше и запустить его с помощьюsh my-task.sh
. При желании вы можете настроить егоsupervisor
как службу, чтобы он запускался при загрузке системы и т. Д.Это действительно звучит так, как будто вы делаете что-то, чего, вероятно, не следует делать. Это чувствует себя неправильно .
источник
Вы можете
cron
каждую минуту запускать скрипт, который запускает 12 фоновых процессов, таким образом:dostuff.sh
:Мой вопрос, однако, таков: что на ЗЕМЛЕ вы могли бы делать, чтобы запускаться каждые 5 секунд?
источник
/media
каталог на наличие диска, который я подключаю к usb для автоматического резервного копирования ...What on EARTH
- статистика, сборка мусора, синхронизация файлов, онлайн-статус, вы называете это.Просто используйте цикл:
Это запустит ваш скрипт как фоновое задание, поспит 5 секунд, затем снова зациклится. Вы можете использовать Ctrl-C, чтобы прервать его, или использовать любое другое условие вместо
true
, например,! test -f /tmp/stop-my-script
только для зацикливания, пока файл/tmp/stop-my-script
не существует.источник
bash: syntax error near unexpected token ';'
, поэтому я вынул его. У меня bash 4.3.11. Моя команда выполняется быстро, поэтому все в порядке, если она выполняется на переднем плане../your-script
было работать в фоновом режиме (во время 5-секундного сна), вы можете оставить,&
но сбросить;
. Поскольку это&
служит для разделения команд, нет необходимости (и, по-видимому, это запрещено) иметь;
после него одну и ту же строку. Другой способ - написать цикл в несколько строк (с разрывом строки после&
и, по желанию, также с разрывом строки послеdo
и доdone
). Поскольку;
после,&
кажется, опечатка, я удалил его. голубоглазый: пожалуйста, не стесняйтесь поставить;
обратно, если вы действительно этого хотите; если так, я предлагаю также добавить объяснение.Вы можете использовать пакет GNU mcron , альтернативу "Vixie cron".
http://www.gnu.org/software/mcron/manual/mcron.html#Top
«Может легко указывать более точные моменты времени, т.е. секунды. В принципе это может быть расширено до микросекунд, но это не реализовано».
источник
mcron
требуетsendmail
установки и активации по умолчанию. как это отключить?Минимальная конфигурация в cron - минуты, вы не можете установить ее в течение 5 секунд. Вы можете использовать Кварц, который позволяет секунд. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
источник
Используйте cacti для мониторинга маршрутизатора и коммутатора, но Cron позволяет использовать не менее одной минуты, поэтому, если один порт / устройство отключен, предупреждения не будет, пока не пройдут две минуты.
источник
Вы можете использовать модуль таймера SystemD, который будет запускать службу - которую вы настроили на выполнение того, что вы хотите - каждые 5 секунд.
Предположим, что ваш сервисный модуль вызывается
mystuff.service
и устанавливается в/etc/systemd/system
(проверьте пользовательские сервисы SystemD, если вы хотите заменить crontab пользователя), затем вы можете написать таймерный блок для запуска сервиса во время загрузки, а затем каждые 5 секунд, например:/etc/systemd/system/mystuff.timer
Затем перезагрузите конфигурацию systemd, включите таймер и запустите его.
источник
Я сделал это очень успешно (и конечный результат занимает несколько недель, пока машина не будет перезагружена). Что касается того, что я делал сейчас, обновлял информацию и помещал ее в кеш - обновлял каждые 10 секунд.
«Exec $ 0» перезапускает скрипт, но заменяет запущенный скрипт. Первоначально он может быть запущен с помощью строки @reboot crontab.
источник
while
цикл вместо повторного запуска сценария?