Запуск cron каждые 30 секунд
Итак, у меня есть хрон, который мне нужно запускать каждые 30 секунд.
Вот что у меня есть:
*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'''
Он работает, но работает ли он каждые 30 минут или 30 секунд?
Кроме того, я читал, что Cron может быть не лучшим инструментом для использования, если я запускаю его так часто. Есть ли другой лучший инструмент, который я могу использовать или установить на Ubuntu 11.04, который будет лучшим вариантом? Есть ли способ исправить вышеуказанный cron?
Ответы
Ответ 1
У вас есть */30
в спецификаторе минут - это означает каждую минуту, но с шагом 30 (другими словами, каждые полчаса). Поскольку cron
не опускается до субминутных разрешений, вам нужно будет найти другой путь.
Одна из возможностей, хотя и немного сложная, состоит в том, чтобы иметь два задания с смещением на 30 секунд:
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Обе работы cron фактически выполняются каждую минуту, но последняя будет ждать полминуты, прежде чем выполнять "мясо" задания, /path/to/executable
.
Для других (non- cron
-based) вариантов см. здесь другие ответы, особенно те, в которых упоминаются fcron
и systemd
. Это, вероятно, предпочтительнее, если ваша система имеет возможность их использовать (например, установить fcron
или иметь дистрибутив с systemd
в нем).
Ответ 2
Вы не можете. Cron имеет 60-секундную гранулярность.
* * * * * cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''
* * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''
Ответ 3
Гранулярность Cron находится в минутах и не предназначена для пробуждения каждые x
секунд, чтобы что-то запускать. Запустите свою повторяющуюся задачу в цикле, и она будет делать то, что вам нужно:
#!/bin/env bash
while [ true ]; do
sleep 30
# do what you need to here
done
Ответ 4
Нет необходимости в двух входах cron, вы можете поместить их в один:
* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
поэтому в вашем случае:
* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"
Ответ 5
Если вы используете новейшую ОС Linux с SystemD, вы можете использовать модуль таймера SystemD для запуска вашего скрипта на любом уровне детализации, который вы пожелаете (теоретически до наносекунд), и - если вы хотите - гораздо более гибкие правила запуска, чем когда-либо допускал Cron., Не требуется sleep
кладжи
Для настройки требуется немного больше, чем для отдельной строки в файле cron, но если вам нужно что-то лучше, чем "Каждую минуту", это того стоит.
Модель таймера SystemD в основном такова: таймеры - это единицы, которые запускают единицы обслуживания по истечении таймера.
Таким образом, для каждого сценария/команды, которую вы хотите запланировать, у вас должен быть блок обслуживания, а затем дополнительный блок таймера. Один таймер может включать в себя несколько расписаний, поэтому обычно вам не требуется более одного таймера и одного сервиса.
Вот простой пример, который регистрирует "Hello World" каждые 10 секунд:
/etc/systemd/system/helloworld.service
:
[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World
/etc/systemd/system/helloworld.timer
:
[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target
После настройки этих устройств (в /etc/systemd/system
, как описано выше, для общесистемной настройки или в ~/.config/systemd/user
для настройки, специфичной для пользователя), вам необходимо включить таймер (но не службу). запустив systemctl enable helloworld.timer
. Если вы хотите запустить таймер немедленно (вместо ожидания его запуска после перезагрузки), также запустите systemctl start helloworld.timer
.
Здесь используются следующие поля раздела [Timer]
:
OnBootSec
- запускать службу через много секунд после каждой загрузки.
OnUnitActiveSec
- запустить службу через много секунд после последнего запуска службы. Это то, что заставляет таймер повторяться и вести себя как задание cron.
AccuracySec
- устанавливает точность таймера. Таймеры точны настолько, насколько это поле установлено, и по умолчанию используется 1 минута (эмулирует cron). Основная причина не требовать максимальной точности заключается в повышении энергопотребления - если SystemD может запланировать следующий запуск так, чтобы он совпадал с другими событиями, он должен реже разбудить ЦП. 1ms
в вышеприведенном примере не идеален - я обычно устанавливаю точность 1
(1 секунда) в моих заданных по минутам запланированных заданиях, но это будет означать, что если вы посмотрите на журнал, показывающий сообщения "Hello World" Вы бы увидели, что это часто поздно на 1 секунду. Если вы согласны с этим, я предлагаю установить точность до 1 секунды или более.
Как вы, возможно, заметили, этот таймер не очень хорошо имитирует Cron - в том смысле, что команда не запускается в начале каждого периода настенных часов (т.е. она не запускается на 10-й секунде на часах, затем на 20-й и так далее). Вместо этого просто происходит, когда таймер истекает. Если система загрузилась в 12:05:37, то в следующий раз команда будет запущена в 12:05:47, затем в 12:05:57 и т.д. Если вас интересует фактическая точность настенных часов, вы можете Я хочу заменить поля OnBootSec
и OnUnitActiveSec
и вместо этого установить правило OnCalendar
с желаемым расписанием (которое, насколько я понимаю, не может быть быстрее 1 секунды при использовании формата календаря). Приведенный выше пример также можно записать так:
OnCalendar=*-*-* *:*:00,10,20,30,40,50
Последнее примечание: как вы, наверное, догадались, модуль helloworld.timer
запускает модуль helloworld.service
, поскольку они имеют одинаковые имена (за исключением суффикса типа модуля). Это значение по умолчанию, но вы можете переопределить его, установив поле Unit
для секции [Timer]
.
Больше подробностей можно найти по адресу:
Ответ 6
Вы можете проверить мой ответ на этот похожий вопрос
В основном, я включил там сценарий bash под названием "runEvery.sh", который вы можете запускать cron каждые 1 минуту и передавать в качестве аргументов настоящую команду, которую вы хотите запустить, и частоту в секундах, в которой вы хотите ее запустить.
что-то вроде этого
* * * * * ~/bin/runEvery.sh 5 myScript.sh
Ответ 7
Задача Cron не может использоваться для планирования задания в секундах. i.e Вы не можете планировать выполнение задания cron каждые 5 секунд. Альтернативой является запись оболочки script, которая использует в ней команду sleep 5
.
Создайте оболочку script every-5-seconds.sh, используя bash while, как показано ниже.
$ cat every-5-seconds.sh
#!/bin/bash
while true
do
/home/ramesh/backup.sh
sleep 5
done
Теперь запустите эту оболочку script в фоновом режиме, используя nohup
, как показано ниже. Это приведет к выполнению script даже после выхода из сеанса. Это выполнит вашу оболочку backup.sh script каждые 5 секунд.
$ nohup ./every-5-seconds.sh &
Ответ 8
Используйте часы:
$ watch --interval .30 script_to_run_every_30_sec.sh
Ответ 9
Используйте fcron (http://fcron.free.fr/) - дает вам детализацию в считанные секунды и делает ее лучше и более функциональной, чем cron (vixie-cron) и стабильной. Раньше я делал глупости, например, когда на одной машине работало около 60 php-скриптов в очень дурацких настройках, и это все еще выполняло свою работу!
Ответ 10
в /etc/cron.d/
new создать файл excute_per_30s
* * * * * yourusername /bin/date >> /home/yourusername/temp/date.txt
* * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt
будет работать cron каждые 30 секунд
Ответ 11
Задача Crontab может использоваться для планирования задания в минутах/часах/днях, но не в секундах. Альтернатива:
Создайте script для выполнения каждые 30 секунд:
#!/bin/bash
# 30sec.sh
for COUNT in `seq 29` ; do
cp /application/tmp/* /home/test
sleep 30
done
Используйте crontab -e
и crontab для выполнения этого script:
* * * * * /home/test/30sec.sh > /dev/null
Ответ 12
Спасибо за все хорошие ответы. Чтобы сделать это простым, мне понравилось смешанное решение, с контролем над crontab и временным разделением на скрипт. Так вот что я сделал, чтобы запустить скрипт каждые 20 секунд (три раза в минуту). Линия Crontab:
* * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log
Автор сценария:
cd /home/a/b/checkAgenda
java -jar checkAgenda.jar
sleep 20
java -jar checkAgenda.jar
sleep 20
java -jar checkAgenda.jar
Ответ 13
написать один скрипт оболочки. создать файл.sh
nano every30second.sh
и писать сценарий
#!/bin/bash
For (( i=1; i <= 2; i++ ))
do
write Command here
sleep 30
done
затем установите cron для этого скрипта crontab -e
(* * * * */home/username/every30second.sh)
этот cron вызывает.sh файл каждые 1 мин и в.sh файле команду запускается 2 раза за 1 мин.
если вы хотите запустить скрипт в течение 5 секунд, замените 30 на 5 и измените для цикла следующим образом: For (( i=1; я <= 12; i++ ))
когда вы выбираете для любой секунды, затем вычисляете 60/ваш второй и записываете в цикл For
Ответ 14
В настоящее время я использую метод ниже. Работает без проблем.
* * * * * /bin/bash -c ' for i in {1..X}; do YOUR_COMMANDS ; sleep Y ; done '
Если вы хотите запускать каждые N секунд, тогда X будет 60/N, а Y будет N.
Спасибо.
Ответ 15
У меня была аналогичная задача, и я использовал следующий подход:
nohup watch -n30 "kill -3 NODE_PID" &
Мне нужно было периодически убивать -3 (чтобы получить трассировку стека программы) каждые 30 секунд в течение нескольких часов.
nohup ... &
Это здесь, чтобы быть уверенным, что я не потеряю выполнение часов, если я потеряю оболочку (проблема с сетью, авария окон и т.д.).
Ответ 16
Cpanel или многие другие хостинг-провайдеры разрешают запускать кроны только раз в минуту. Вы не можете планировать каждую секунду или 30 секунд cron, используя обычный способ.
Но теперь вы можете запускать свои кроны с любыми секундами с помощью WebCron.
Запускать каждую секунду: настроить выполнение cron на каждую секунду или после гибкого интервала до одной минуты
2 Hours Timeout: Запустите cron, пока ваша задача не будет завершена. 2 часа тайм-аут для вашей работы cron.
Поддерживаемые методы HTTP: Мы поддерживаем все методы HTTP, включая GET, POST, PUT, HEAD и т.д.
Установите cronjob легко: просто введите URL-адрес cronjob, затем выберите желаемый интервал времени, например, "Каждую секунду", и готово!
Журналы выполнения заданий Cron: особенность ведения журналов выполнения заданий cron позволяет сохранять выходные данные cron для последующей проверки.
Настройте заголовки HTTP: добавьте свои собственные заголовки HTTP, включая файлы cookie, пользовательский агент и все остальное.
WebCron - это онлайновая веб- платформа для выполнения cron, которая предлагает выполнение заданий cron за секунду.
https://webcron.site/
Ответ 17
Посмотрите на часто-cron - он старый, но очень стабильный, и вы можете перейти на микросекунды. На данный момент, единственное, что я хотел бы сказать против этого, - это то, что я все еще пытаюсь понять, как установить его вне init.d, но в качестве нативной службы systemd, но, конечно, до Ubuntu 18, на котором он работает нормально все еще используя init.d (расстояние может отличаться в последних версиях). У него есть дополнительное преимущество (?), Заключающееся в том, что он не будет порождать другой экземпляр скрипта PHP, если не завершен предыдущий, что уменьшает потенциальные проблемы утечки памяти.
Ответ 18
Выполнить в цикле оболочки, например:
#!/bin/sh
counter=1
while true ; do
echo $counter
counter=$((counter+1))
if [[ "$counter" -eq 60 ]]; then
counter=0
fi
wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 &
sleep 1
done
Ответ 19
Просто используйте:
*/2 * * * * *
т.е. 1 минута в секундах (60) делится на 2.