Comment tuer à la fois le processus et le sous-processus?

9

J'ai posé une question pour savoir comment obtenir plusieurs lignes de message à partir du module de sous-processus de Python.

Le problème est qu'au cours des tests, j'ai dû tuer le processus python qui exécute le processus gnuchess. L'utilisation de ^ c dans la ligne de commande semble tuer le processus python, mais pas le gnuprocess.

Pour tuer gnuchess, je reçois le pid avec ps aux | grep gnuchess et exécutez kill -9 PID . Existe-t-il d'autres méthodes pour tuer les processus python et gnuchess?

prosseek
la source
8
Sidenote aléatoire: vous pouvez utiliser pkillpour tuer un processus par son nom, de sorte que votre ps aux | grep gnuchesset kill -9 PIDpeut simplement devenirpkill -9 gnuchess
Michael Mrozek

Réponses:

10

Il existe une méthode standard, si les programmes coopèrent. Exécutez kill -- -42où 42 est le pid du processus parent. Cela envoie un signal à tous les processus du groupe de processus dirigé par le processus 42 (le signe moins devant le pid signifie le groupe de processus).

Normalement, si vous exécutez votre script python à partir d'une invite de shell et qu'il bifurque simplement gnuchess, les deux processus doivent rester dans le même groupe de processus. Mais cela ne semble pas être le cas, car Ctrl+ Cenvoie SIGINTà l'ensemble du groupe de processus de premier plan.

Gnuchess pourrait être dans son propre groupe de processus parce qu'il s'est fait chef de session (mais je ne sais pas pourquoi il ferait cela), ou parce que vous l'avez doublé (python forks un shell qui forch gnuchess). Un double fork est probablement évitable, mais je ne peux pas vous dire comment sans voir votre code.


Un moyen raisonnablement fiable et conforme à POSIX de trouver le pid du gnuchessprocessus est

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

Des variantes spécifiques d'Unix peuvent avoir de meilleurs moyens d'y parvenir, telles que pgrep.

Gilles 'SO- arrête d'être méchant'
la source
0

Essayer:

pkill <processname>
Dilemme
la source