Запуск 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 ответов


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

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

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

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


вы не можете. Cron имеет зернистость 60 sec.

* * * * * 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 * * * * ~/bin/runEvery.sh 5 myScript.sh


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

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

$ 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

in dir /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 секунд (три раза в минуту). Crontab line:

 * * * * 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 и т. д...)


написать один скрипт создать .sh file

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