2012-03-09 94 views
31

我有這樣的cron作業兩個命令:在cron作業中按順序運行兩個命令?

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

,但在我看來,他們兩人都在同一時間運行。

如何讓第一個命令運行並在完成時執行第二個命令?

此外,AfterMyFunction1.php具有javascript http請求,當我使用wget時,不會執行這些請求。如果我在我的瀏覽器中打開AfterMyFunction1.php,它就可以工作。

+1

wget無法解析並執行您檢索的HTML頁面中的嵌入式JavaScript。 wget不呈現它只是檢索內容的頁面。 – 2012-03-10 18:35:45

回答

69

如果第一個命令需要先完成,則應該像在shell中一樣將它們與the && operator分開。如果第一次失敗,第二次將不會運行。

+8

製作一個連續運行多個文件的腳本,並對該腳本執行腳本,而不是使用&& – JustinP 2014-04-04 16:44:45

+12

來分隔大的列表命令,這似乎更容易和更易於維護。如果只有兩個命令,我不會看到問題出在哪裏以及該文件如何幫助,你也將不得不照顧這個文件(燙髮,存儲...),這需要更多的時間是更多的成本和更低的效率。 – BigDong 2016-07-22 04:58:42

+0

我不認爲這個答案是正確的 - 分號將按順序運行命令,而不是並行運行。所以我不認爲OP的命令行有什麼問題。 – nonagon 2017-10-05 17:43:44

2

您可以使用作爲GNU parallel的一部分的sem

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 

這cron的配置將首先啓動mysql通過sem,它將把它放在一個隊列一種叫MyQueue。這個隊列可能是空的,所以立即執行mysql。一分鐘後,cron將啓動另一個sem,這將使wget處於同一隊列中。通過--jobs 1sem被指示在該特定隊列中一次只執行一個作業。一旦mysql完成,第二個sem將運行wget命令。 sem有很多選項來控制排隊行爲。

&&解決方案可能會更好,因爲它在第一個失敗時不會執行第二個命令。 sem解決方案的優點是您可以指定不同的cron設置,如不同的用戶。如果cron間隔比作業持續時間短,它將防止重疊的cron作業。