J'ai un script qui s'exécute toutes les 15 minutes mais parfois, si la boîte est occupée, elle se bloque et le processus suivant commence avant que la première un effet boule de neige. Comment puis-je ajouter quelques lignes au script bash pour vérifier si quelque chose est en cours d'exécution avant de commencer?Comment vérifier dans un script bash si quelque chose est en cours d'exécution et quitter s'il est
Comment vérifier dans un script bash si quelque chose est en cours d'exécution et quitter s'il est
Répondre
Au lieu de .pid, tant que votre script a un nom identifiable de manière unique que vous pouvez faire quelque chose comme ceci:
#!/bin/bash
COMMAND=$0
# exit if I am already running
RUNNING=`ps --no-headers -C${COMMAND} | wc -l`
if [ ${RUNNING} -gt 1 ]; then
echo "Previous ${COMMAND} is still running."
exit 1
fi
... rest of script ...
Je l'ai fait et Je devais le peaufiner un peu. Tout d'abord, COMMAND inclut le chemin complet, à moins que vous ne l'exécutiez à partir du même répertoire, cela ne fonctionne pas. J'ai codé le nom de toute façon. Deuxièmement, pour une raison quelconque, ps --no-headers -C $ {COMMAND} | wc -l renvoyait toujours 1 sans rien courir et puisque ce script est en cours d'exécution alors qu'il vérifie que c'est un autre 1, il a toujours retourné 2. J'ai dû changer le -gt 1 en -gt 2 et cela a fonctionné. Merci. –
Pourquoi ne pas définir un fichier de verrouillage?
Quelque chose comme
yourapp.lock
juste l'enlever lorsque vous traitez est terminé, et vérifier avant de le lancer.
Il pourrait être fait en utilisant
if [ -f yourapp.lock ]; then
echo "The process is already launched, please wait..."
fi
Parce que gérer correctement un fichier de verrouillage, en particulier gérer le cas où un processus s'est terminé de manière incorrecte et n'a pas réussi à effacer son fichier de verrouillage, prend plus de quelques lignes dans bash. – chaos
Si vous utilisez 'flock', les fichiers de verrouillage sont faciles à gérer - mais oui, utiliser' -f' pour tester leur existence est Evil And Wrong. –
Vous pouvez utiliser pidof -x
si vous connaissez le nom du processus ou kill -0
si vous connaissez le PID.
Exemple:
if pidof -x vim > /dev/null
then
echo "Vim already running"
exit 1
fi
Pour développer ce @bgy dit, la façon dont atomique en toute sécurité pour créer un fichier de verrouillage si elle n'existe pas encore, et échouera si elle n'a pas, est de créer un fichier temporaire, puis reliez-le au fichier de verrouillage standard. Cela protège contre un autre processus créant le fichier entre vous le tester et vous le créer.
Voici le code du fichier de verrouillage de mon script de sauvegarde horaire:
echo $$ > /tmp/lock.$$
if ! ln /tmp/lock.$$ /tmp/lock ; then
echo "previous backup in process"
rm /tmp/lock.$$
exit
fi
Ne pas oublier de supprimer le fichier de verrouillage et le fichier temporaire lorsque vous avez terminé, même si vous quittez tôt par un Erreur.
Utilisez ce script:
FILE="/tmp/my_file"
if [ -f "$FILE" ]; then
echo "Still running"
exit
fi
trap EXIT "rm -f $FILE"
touch $FILE
...script here...
Ce script crée un fichier et le retirer à la sortie.
Pour une méthode qui ne souffre pas de l'analyse syntaxique des bugs et des conditions de course, consultez:
J'ai eu récemment la même question et trouvé en haut qui tuent -0 est le mieux pour ma cas:
echo "Starting process..."
run-process > $OUTPUT &
pid=$!
echo "Process started pid=$pid"
while true; do
kill -0 $pid 2> /dev/null || { echo "Process exit detected"; break; }
sleep 1
done
echo "Done."
Voici comment je le fais dans un de mes emplois Cron
lockfile=~/myproc.lock
minutes=60
if [ -f "$lockfile" ]
then
filestr=`find $lockfile -mmin +$minutes -print`
if [ "$filestr" = "" ]; then
echo "Lockfile is not older than $minutes minutes! Another $0 running. Exiting ..."
exit 1
else
echo "Lockfile is older than $minutes minutes, ignoring it!"
rm $lockfile
fi
fi
echo "Creating lockfile $lockfile"
touch $lockfile
et supprimer le fichier de verrouillage à la fin du script
echo "Removing lock $lockfile ..."
rm $lockfile
- 1. Comment vérifier si un site Web est en cours
- 2. Comment vérifier si NetStream est en cours de lecture
- 3. Test si quelque chose est une classe en javascript
- 4. Déterminer si un script ruby est déjà en cours d'exécution
- 5. ASP - Déterminer si le script en cours est en cours d'exécution comme un include
- 6. Comment vérifier si l'itérateur STL pointe sur quelque chose?
- 7. Comment vérifier par programme si le téléphone mobile est en cours de charge ou s'il est en cours de chargement?
- 8. Comment puis-je déterminer si quelque chose est un tableau ou un objet en PHP?
- 9. Si la case est cochée, exécutez « quelque chose »
- 10. Comment puis-je vérifier par programme si une application CYGWIN est installée dans un script SH?
- 11. Vérifier si mysql_query a retourné quelque chose ou non
- 12. Comment vérifier si un processus est en cours d'exécution dans le gestionnaire de tâches avec python
- 13. Comment vérifier si un processus est en cours d'exécution en utilisant Delphi?
- 14. Y at-il un appel d'API sélénium pour vérifier si quelque chose est sélectionné dans un MultiSelectField?
- 15. Est-il possible de quitter gracieusement dans un constructeur?
- 16. Vérifiez si l'application est déjà en cours d'exécution
- 17. Comment vérifier si une valeur est un entier dans MySQL?
- 18. Comment faire quelque chose à tous les fichiers dans un répertoire en utilisant bash?
- 19. Bash: Comment vérifier si certains fichiers existent?
- 20. Comment vérifier lors de l'installation si un certain programme est en cours d'exécution?
- 21. Vérifiez si stderr est un tube dans bash
- 22. Vérifiez si un proc stocké est en cours d'exécution?
- 23. Comment vérifier si un pointeur est valide?
- 24. Comment vérifier si FileObject est un dossier?
- 25. AS3: Vérifier si un dictionnaire est vide
- 26. Comment puis-je vérifier si un service Windows est en cours
- 27. Comment vérifier si quelque chose existe dans une base de données SQL?
- 28. Déterminer si un pathspec est un répertoire ou un fichier (ou quelque chose d'autre) via WMI?
- 29. Comment déterminer si un assemblage est en cours d'utilisation?
- 30. Bash: vérifier que l'entrée de l'utilisateur est correcte
Dupe de 185451. – Rob
Voir [http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-running-at-a](http : //stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-runnin g-at-a). – Rob
duplication possible de [exécution de script shell vérifier si elle est déjà en cours d'exécution ou non] (http://stackoverflow.com/questions/16807876/shell-script-execution-check-if-it-is-already-running-or- – Pureferret