Запуск cron каждые 30 секунд


хорошо, поэтому у меня есть cron, который мне нужно запускать каждые 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

14 198

14 ответов:

у вас есть */30 на минут спецификатор-это означает каждую минуту, но с шагом 30 (другими словами, каждые полчаса). Так как cron не идет вниз к югу минутах резолюций, вам придется найти другой способ.

одна возможность, хотя это немного kludge, состоит в том, чтобы иметь два задания, одно смещение на 30 секунд:

* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

и cron задания фактически выполняются каждую минуту, но последний будет ждать полминуты до выполняя "мясо" задания,/path/to/executable.

вы не можете. 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'\''

детализация Cron находится в минутах и не было предназначен для пробуждения каждого x секунд, чтобы запустить что-то. Запустите повторяющуюся задачу в цикле, и она должна делать то, что вам нужно:

#!/bin/env bash
while [ true ]; do
 sleep 30
 # do what you need to here
done

нет необходимости в двух записях 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'\''"

вы можете проверить мой ответ этот же вопрос

в принципе, я включил туда сценарий bash с именем "runEvery.sh" который вы можете запускать с cron каждые 1 минуту и передавать в качестве аргументов реальную команду, которую вы хотите запустить, и частоту в секундах, в которой вы хотите ее запустить.

как то так

*/1 * * * * ~/bin/runEvery.sh 5 myScript.sh

задание Cron нельзя использовать для планирования задания с интервалом в несколько секунд. т. е. вы не можете запланировать выполнение задания cron каждые 5 секунд. Альтернативой является написание сценария оболочки, который использует в нем.

создать сценарий оболочки every-5-seconds.sh используя bash в то время как цикл, как показано ниже.

$ cat every-5-seconds.sh
#!/bin/bash
while true
do
 /home/ramesh/backup.sh
 sleep 5
done

теперь выполните этот сценарий оболочки в фоновом режиме с помощью nohup как показано ниже. Это будет продолжать выполнять сценарий даже после выхода из сеанса. Эта воля выполняйте ваши backup.sh сценарий оболочки каждые 5 секунд.

$ nohup ./every-5-seconds.sh &

смотри:

$ watch --interval .30 script_to_run_every_30_sec.sh

в направлении /etc/cron.d/

создать файл excute_per_30s

* * * * * yourusername  /bin/date >> /home/yourusername/temp/date.txt
* * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt

будет работать cron каждые 30 секунд

использовать fcron (http://fcron.free.fr/) - дает вам детализацию в секундах и способ лучше и богаче функциями, чем cron (vixie-cron) и стабильный тоже. Раньше я делал глупые вещи, такие как около 60 PHP-скриптов, работающих на одной машине в очень глупых настройках, и он все еще делал свою работу!

задание Crontab можно использовать для планирования задания в минутах / часах / днях, но не в секундах. Альтернатива:

создать скрипт для выполнения каждые 30 секунд:

#!/bin/bash
# 30sec.sh

for COUNT in `seq 29` ; do
  cp /application/tmp/* /home/test
  sleep 30
done

использовать crontab -e и crontab для выполнения этого скрипта:

* * * * * /home/test/30sec.sh > /dev/null

Спасибо за все хорошие ответы. Чтобы сделать его простым, мне понравилось смешанное решение, с контролем на crontab и временным разделением на скрипте. Так вот что я сделал, чтобы запускать скрипт каждые 20 секунд (три раза в минуту). Кронтаб строку:

 * * * * 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 

у меня просто была аналогичная задача, чтобы сделать и использовать следующий подход:

nohup watch -n30 "kill -3 NODE_PID" &

мне нужно периодически убивать -3 (чтобы получить трассировку стека программы) каждые 30 секунд в течение нескольких часов.

nohup ... & 

это здесь, чтобы быть уверенным, что я не потеряю выполнение часов, если я потеряю оболочку (сетевая проблема, сбой windows и т. д...)

написать один скрипт создавать .Ш. файлом

нано 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 call. sh файл в каждые 1 мин & в команде. SH file выполняется 2 раза в 1 мин

Если вы хотите запустить скрипт в течение 5 секунд, то замените 30 на 5 и измените цикл следующим образом:For (( i=1; i <= 12; i++ ))

когда вы выберите для любой секунды, затем вычислите 60 / вашу секунду и запишите для цикла

выполнить в цикле оболочки, например:

#!/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