2012-03-08 4 views
178

Ok поэтому у меня есть хроны, что мне нужно каждые 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, который будет лучшим вариантом или есть способ исправить выше хроны

+0

CommaToast, и что произойдет, если ваш Javascript или Java приложение падает по какой-то причине и выходит? Как он будет перезагружен? :-) – paxdiablo

+9

Добавить небольшое приложение NodeJS, lol. Почему не небольшое приложение C++? Пока мы на нем, мы можем назвать его «cron» и запустить его как услугу. – Andrew

+1

Возможный дубликат [Как запустить Cronjobs чаще, чем один раз в минуту?] (Http://stackoverflow.com/questions/4672383/how-to-run-cronjobs-more-often-than-once-per-minute) – rubo77

ответ

463

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

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

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

Оба хрон рабочих мест на самом деле запустить каждую минуту, но последний из них будет ждать половину за минуту до выполнения «мяса» работы, /path/to/executable.

+52

, если ответ paxdiablo помог вам пометить его как ответ по умолчанию. – sufinawaz

+5

Это отличный обходной путь, поэтому я думаю, что он превосходит его kludginess –

+0

не так ли будет работать? '* * * * * (/ path/to/executable param1 param2; sleep 30;/path/to/executable param1 param2)' – rubo77

46

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

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

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

Имейте в виду, что это не _quite_ то же самое. Если задание занимает 25 секунд (например), оно запускается каждые 55 секунд, а не каждые 30 секунд. Это может быть неважно, но вы должны знать о возможных последствиях. – paxdiablo

+6

Вы можете запустить задание в фоновом режиме, после чего оно будет работать почти ровно 30 секунд. –

+1

в то время как [правда] сделать сна 30 # делать то, что вам нужно, чтобы здесь сделано --------- сделано должно быть в случае малого – temple

10

Вы можете проверить мой ответ на this similar question

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

что-то вроде этого

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

8

хрон не может быть использована для планирования задания в интервале секунд. i.e Вы не можете планировать выполнение задания cron каждые 5 секунд. Альтернативой является написать сценарий оболочки, в котором используется команда sleep 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 & 
+3

Время будет дрейфовать. Например, если 'backup.sh' занимает 1,5 секунды для запуска, он будет выполняться каждые 6,5 секунды. Есть способы избежать этого, например 'sleep $ ((5 - $ (date +% s)% 5))' –

+0

Я новичок в nohup, при выполнении вашего примера nohup возвращает «нет такого файла или каталога», , После некоторых поисков вы, кажется, пропустили «sh» после nohup. Например: $ nohup sh ./every-5-seconds.sh & – VHanded

3

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

+0

Исповедь разработчика PHP;) –

+0

На самом деле, признания системного инженера, позволяющие разработчикам PHP .... :) –

15

Нет необходимости в двух записях хрон, вы можете поместить его в один с:

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

Примечание: это работает только в том случае, если сценарий занимает менее секунды для запуска – rubo77

+1

Rubo - если задание занимает несколько секунд (вместо милли или микросекунды), чтобы вы не запускали его каждые тридцать секунд, чтобы выполнять два раза в минуту. Итак, да, начните с 30, а затем вычтите из этого приблизительное количество секунд за ход, если больше 1 секунды. – Andrew

4

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

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

#!/bin/bash 
# 30sec.sh 

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

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

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

Если я это правильно понимаю, этот скрипт запускается 30 раз и ждет 30 секунд между каждой итерацией. Как имеет смысл запускать его каждую минуту в cron? – FuzzyAmi

4

Используйте часы:

$ watch --interval .30 script_to_run_every_30_sec.sh 
+0

Могу ли я использовать что-то вроде '$ watch --interval .10 php some_file.php'? или 'watch' работает только с .sh-файлами? – fonjeekay

0

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

nohup watch -n30 "kill -3 NODE_PID" & 

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

nohup ... & 

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

0

в реж /etc/cron.d/

новый создать файл excute_per_30s

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

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

0

Спасибо за все хорошие ответы. Чтобы сделать это простым, мне понравилось смешанное решение, с контролем над 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 
Смежные вопросы