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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top