web-dev-qa-db-ja.com

cronジョブで2つのコマンドを連続して実行しますか?

このようなcronジョブには2つのコマンドがあります。

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

しかし、私にはそれらの両方が同時に実行されているようです。

最初のコマンドを実行し、完了したら2番目のコマンドを実行するにはどうすればよいですか?

また、AfterMyFunction1.phpには、wgetを使用したときに実行されないjavascript http要求があります。 webbrowserでAfterMyFunction1.phpを開いた場合に機能します。

43
medo ampir

最初のコマンドを最初に完了する必要がある場合は、シェルで行う場合と同様に &&演算子 で区切る必要があります。最初が失敗した場合、2番目は実行されません。

77
vincent

GNU sem。の一部である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

このcron構成は、最初にmysqlからsemを開始し、MyQueueと呼ばれる種類のキューに入れます。このキューはおそらく空なので、mysqlがすぐに実行されます。 1分後、cronは別のsemを開始し、wgetを同じキューに入れます。 --jobs 1を使用すると、semは特定のキューで一度に1つのジョブのみを実行するように指示されます。 mysqlが終了するとすぐに、2番目のsemwgetコマンドを実行します。 semには、キューイング動作を制御する多くのオプションがあります。たとえば、--semaphoretimeout -60を追加すると、待機中のジョブは60秒後に単純に終了します。

最初のコマンドが失敗したときに2番目のコマンドを実行しないため、&&ソリューションの方がおそらく優れています。 semソリューションには、異なるユーザーのように異なるcron設定を指定できるという利点があります。また、cron間隔がジョブの継続時間より短い場合、cronジョブの重複を防ぎます。

6
Onnonymous