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.