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 courent en même temps.
comment exécuter la première commande et quand elle est terminée, exécuter la seconde commande?
aussi la fonction Afterwy1.php a des requêtes http javascript qui ne sont pas exécutées lorsque j'utilise wget. Ça marche si J'ouvre Afternyfunction1.php dans mon webbrowser.
2 réponses
si la première commande doit être exécutée en premier, vous devez les séparer avec the && operator comme vous le feriez dans le shell. Si le premier échoue, le second ne court 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 de cron va d'abord démarrer le mysql
par sem
, ce qui le mettra 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 lancera un autre sem
qui mettra le wget
dans la même file. Avec --jobs 1
, sem
est chargé de exécuter une seule tâche à la fois dans cette file d'attente. Dès que le mysql
est terminé, le second sem
exécute la commande wget
. sem
dispose de nombreuses options pour contrôler le comportement de la file d'attente. Par exemple , si vous ajoutez --semaphoretimeout -60
, un travail en attente va simplement mourir après 60 secondes.
la solution &&
est probablement meilleure, car elle n'exécute pas la seconde commande lorsque la première échoue. La solution sem
a l'avantage que vous pouvez spécifier différents cron paramètres, comme un autre utilisateur. Et cela évitera le chevauchement des tâches cron, si l'intervalle cron est plus court que la durée de l'emploi.