2012-03-09 1 views
31

У меня есть две команды в хрон, как это:Выполнение двух команд последовательно в задании cron?

mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1";wget -N http://mywebsite.net/path/AfterMyFunction1.php 

, но мне кажется, что оба они работают одновременно.

Как я могу выполнить первый запуск команды и когда она завершится, выполните вторую команду?

Также у AfterMyFunction1.php есть HTTP-запросы javascript, которые не выполняются при использовании wget. Он работает, если я открыл AfterMyFunction1.php в своем веб-браузере.

+1

wget не может разобрать и выполнить встроенный javascript на возвращаемых HTML-страницах. wget не отображает страницу, на которой он просто извлекает содержимое. –

ответ

69

Если первая команда требуется выполнить сначала, вы должны разделить их на the && operator так же, как и в оболочке. Если первое не удается, второе не будет работать.

+8

Кажется проще и удобнее обслуживать сценарий, который последовательно запускает несколько файлов и выполняет этот сценарий по сравнению с наличием больших команд списка, разделенных идентификатором && – JustinP

+12

. Если у вас есть только две команды, я не вижу, где проблема, и как этот файл будет помогите, также вам придется позаботиться об этом файле (perms, store ...), для этого требуется больше времени, это более затратно и менее эффективно. – BigDong

+0

Я не думаю, что этот ответ правильный - точка с запятой будет запускать команды последовательно, а не параллельно. Поэтому я не думаю, что что-то не так с командной строкой OP. – nonagon

2

Вы можете использовать sem, который является частью GNU parallel.

0 0 * * * root sem --jobs 1 --id MyQueue mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1" 
1 0 * * * root sem --jobs 1 --id MyQueue wget -N http://mywebsite.net/path/AfterMyFunction1.php 

Это хроны конфигурация будет первой начать mysql через sem, который поставит его в своем роде очередь называет MyQueue. Эта очередь, вероятно, будет пустой, поэтому mysql будет выполнен немедленно. Через минуту cron запустит еще один sem, который поместит wget в ту же очередь. С --jobs 1, sem поручено выполнить только одно задание за раз в этой конкретной очереди. Как только mysql закончит, второй sem будет запускать команду wget. sem имеет множество возможностей контролировать поведение в очереди.

Решение &&, вероятно, лучше, так как оно не будет выполнять вторую команду, если первая не удалась. Преимущество решения sem состоит в том, что вы можете указать разные настройки cron, как у другого пользователя. И это предотвратит перекрытие заданий cron, если интервал cron короче, чем продолжительность работы.