J'essaie d'écrire un script bash robuste et j'y crée un processus d'arrière-plan. À la fin du script, je veux le tuer. J'ai son PID.
Je pensais à quelque chose comme ça
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
Quelqu'un suggère-t-il quelque chose de mieux? Des problèmes possibles avec cette approche?
ps -ef
?while [[ ps ef $PID ]]
est une erreur de syntaxe. Je suppose que vous vouliez direwhile ps ef $PID
.Réponses:
Le problème avec la mort répétée d'un processus est que vous avez une condition de concurrence avec la création d'un nouveau processus. Ce n'est pas particulièrement probable, mais il est possible que le processus se termine et qu'un nouveau processus démarre avec le même PID pendant que vous dormez.
Pourquoi devez-vous tuer à plusieurs reprises le processus? Si c'est parce que le processus va se terminer, mais qu'il peut prendre un certain temps pour quitter après avoir reçu le signal, vous pouvez utiliser
wait
:Dans un système idéal, vous n'auriez jamais à répéter un
kill
ou un problèmekill -9 $PID
. Si vous le devez, vous voudrez peut-être envisager de réparer tout ce que vous exécutez afin de ne pas avoir à le faire. En attendant, vous n'atteindrez probablement pas la condition de concurrence, et vous pouvez vous en prémunir en (par exemple) en vérifiant l'horodatage de / proc / $ PID / juste avant de tuer le processus. C'est du mauvais piratage, cependant.la source
bash: wait: pid 32137 is not a child of this shell
quand j'essaye. :(Pour tous ceux qui recommandent l'étape de
kill $PID
àkill -9 $PID
, je dois vous rappeler l' utilisation inutile de kill -9 .Maintenant, je ne suis pas d'accord avec le "supprimer la partie binaire", mais la progression semble moins dommageable qu'un simple
kill -9
.Je suis également d'accord avec le soin des conditions de concurrence sur la création de nouveaux processus avec le même PID mentionné ici .
la source
Faites d'abord votre mise à mort normale, Sleep x nombre de secondes, puis tuez -9 si elle est toujours là. En outre, cela semble être une situation étrange dans laquelle vous êtes entré, pourrait vouloir nous expliquer le problème plus large.
la source
En règle générale, vous voulez d'
kill $PID
abord essayer ,puis laissez-le dormir un peu pour voir s'il se fermera correctement.
Sinon, exécutez-le
kill -9 $PID
pour vous en débarrasser avec force.la source
pourquoi pas
kill -9 $PID
la source