Toute solution qui utilise quelque chose comme ps aux | grep abc
o pgrep abc
sont défectueux.
Pourquoi ?
Parce que vous ne vérifiez pas si un processus spécifique est en cours d'exécution, vous vérifiez s'il y a des processus en cours d'exécution qui se trouvent correspondre à abc
. Tout utilisateur peut facilement créer et exécuter un exécutable nommé abc
(ou qui contient abc
quelque part dans son nom ou ses arguments), provoquant un faux positif pour votre test. Il existe plusieurs options que vous pouvez appliquer à ps
, grep
y pgrep
pour limiter 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 ?
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, et si non, le démarrer
C'est à ça que sert systemd. Il peut démarrer le service automatiquement et en garder la trace, et il peut réagir quand il meurt.
Voir Comment puis-je vérifier si mon serveur de jeu fonctionne toujours... 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 lockfile ou un lockdir. Par exemple
#!/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 ...
Voir FAQ Bash 45 pour d'autres moyens de verrouillage.