Запуск 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.