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.
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.
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.