Toute solution utilisant quelque chose comme ps aux | grep abc
ou pgrep abc
est défectueuse.
Pourquoi?
Comme vous ne vérifiez pas si un processus spécifique est en cours d'exécution, vous vérifiez si des processus en cours d'exécution correspondent à abc
. Tout utilisateur peut facilement créer et exécuter un exécutable nommé abc
(ou contenant abc
quelque part dans son nom ou ses arguments), ce qui provoque un faux positif pour votre test. Vous pouvez appliquer différentes options à ps
, grep
et pgrep
pour affiner la recherche, mais vous n’obtiendrez toujours pas de test fiable.
Alors, comment puis-je tester de manière fiable un certain processus en cours d'exécution?
Cela dépend de la raison pour laquelle vous avez besoin du test.
Je veux m'assurer que le service abc est en cours d'exécution. Sinon, démarrez-le
C’est à cela que servent init et upstart. Ils vont démarrer le service et s'assurer que son pid est stocké dans un pidfile. Essayez de redémarrer le service (via init ou upstart) et il vérifiera le pidfile, et le démarrera s'il n'est pas là ou annulera s'il est déjà en cours d'exécution. Ce n’est toujours pas fiable à 100%, mais c’est aussi proche que possible.
Voir le pour d'autres solutions.
abc est mon script. Je dois m'assurer qu'une seule instance de mon script est en cours d'exécution.
Dans ce cas, utilisez un fichier lockfile ou un lockdir. Ex.
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
Consultez la FAQ Bash 45 pour connaître d'autres méthodes de verrouillage.