Comment puis-je vérifier le code de sortie d'une commande exécutée par troupeau?
-
21-09-2019 - |
Question
Bonjour tous. J'installe une tâche cron pour exécuter un script bash, et je suis inquiet que le prochain peut commencer avant que la précédente se termine. Un peu googler révèle que un moyen populaire pour résoudre c'est la commande flock
, utilisée de la manière suivante:
flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
echo "Previous script is still running! Can't execute!"
fi
Cela fonctionne très bien. Cependant, que dois-je faire si je veux vérifier le code de sortie de myscript.sh
? Quel que soit le code de sortie, il retourne sera remplacé par années flock
, donc je n'ai aucun moyen de savoir si elle exécutée avec succès ou non.
La solution
Il semble que vous pouvez utiliser la forme alternative de flock
, flock <fd>
, où <fd>
est un descripteur de fichier. Si vous mettez cela dans un sous-shell et redirigez ce descripteur de fichier à votre fichier de verrouillage, puis troupeau attendra jusqu'à ce qu'il puisse écrire dans ce fichier (ou l'erreur si elle ne peut pas ouvrir immédiatement et que vous avez passé -n
). Vous pouvez alors faire tout dans votre sous-shell, y compris tester la valeur de retour des scripts que vous exécutez:
(
if flock -n 200
then
myscript.sh
echo $?
fi
) 200>lockfile
Autres conseils
#!/bin/bash
if ! pgrep myscript.sh; then
flock -n lockfile myscript.sh
fi
Si je vous comprends bien, vous voulez vous assurer que « myscript.sh » ne tourne pas avant Cron tente d'exécuter votre commande. En supposant que ce droit, nous vérifions si pgrep n'a pas réussi à trouver myscript.sh dans la liste des processus et si oui, nous courons à nouveau la commande de troupeau.
Peut-être quelque chose comme cela pour vous.
#!/bin/bash
RETVAL=0
lockfailed()
{
echo "cannot flock"
exit 1
}
(
flock -w 2 42 || lockfailed
false
RETVAL=$?
echo "original retval $RETVAL"
exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL