web-dev-qa-db-fra.com

Exécuter deux commandes séquentiellement dans un travail cron?

J'ai deux commandes dans un travail cron comme celui-ci:

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

mais il me semble que les deux tournent en même temps.

Comment puis-je exécuter la première commande et quand elle se termine, exécuter la deuxième commande?

Les AfterMyFunction1.php ont également des requêtes http javascript qui ne sont pas exécutées lorsque j'utilise wget. Cela fonctionne si j'ai ouvert AfterMyFunction1.php dans mon navigateur Web.

43
medo ampir

Si la première commande doit être exécutée en premier, vous devez les séparer avec l'opérateur && comme vous le feriez dans le shell. Si le premier échoue, le second ne s'exécutera pas.

77
vincent

Vous pouvez utiliser sem qui fait partie de 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

Cette configuration cron démarrera d'abord les mysql à sem, ce qui les placera dans une sorte de file d'attente appelée MyQueue. Cette file d'attente sera probablement vide, donc le mysql est exécuté immédiatement. Une minute plus tard, le cron démarrera un autre sem qui mettra le wget dans la même file d'attente. Avec --jobs 1, sem est chargé d'exécuter un seul travail à la fois dans cette file d'attente particulière. Dès que mysql est terminé, le second sem exécutera la commande wget. sem possède de nombreuses options pour contrôler le comportement de mise en file d'attente. Par exemple, si vous ajoutez --semaphoretimeout -60, un travail en attente mourra simplement après 60 secondes.

Le && la solution est probablement meilleure, car elle n'exécutera pas la deuxième commande lorsque la première échoue. La solution sem a l'avantage que vous pouvez spécifier différents paramètres cron, comme un utilisateur différent. Et cela empêchera le chevauchement des tâches cron, si l'intervalle cron est plus court que la durée de la tâche.

6
Onnonymous