J'écris un script bash à utiliser inotifywait
pour surveiller un répertoire et lancer des actions lorsque des changements sont détectés. Quelque chose comme:
inotifywait -m ... | while read f; do something; done
Puisque inotifywait
ne se termine pas par lui-même, ce script ne s'arrêtera pas.
Mon plan était donc d'obtenir le PID du processus inotifywait, de l'enregistrer dans un fichier et de le tuer plus tard par un processus différent, par exemple:
inotifywait -m ... | { echo ??PID?? > pid-file; while ... }
Mais je ne sais pas comment obtenir le PID. Existe-t-il un moyen simple d'y parvenir? Une autre façon consiste simplement à enregistrer le PID du script shell $$
dans le fichier et à tuer l'intégralité du script shell, mais je voulais faire un peu de nettoyage après la boucle while.
J'ai essayé d'utiliser coproc
et je pense que cela fonctionnera mais cela semble être plus compliqué que nécessaire.
pgrep inotifywait
. Cela vous donnera le PID, tuer,pkill inotifwait
.grep -v grep
, mais vousps -ef | grep [p]rocessname...
feriez de même.-f
commutateur si vous avez besoin de faire correspondre plus de noms d'exécutables.Réponses:
Dans un pipeline, tous les processus sont démarrés simultanément , aucun n'est plus tôt que les autres.
Vous pourriez faire:
Ou portable:
Notez également que lorsque le sous-shell qui exécute la
while
boucle se termine,inotifywait
il sera automatiquement tué la prochaine fois qu'il écrit quelque chose sur stdout.la source
Si vous avez besoin de l'ID de processus dans la boucle, imprimez-le d'abord.
la source
Cette réponse SO semble applicable:
la source