Como matar o processo e o subprocesso?


9

Fiz uma pergunta para saber como obter várias linhas de mensagem do módulo de subprocesso do Python.

O problema é que, durante o teste, eu tive que matar o processo python que executa o processo gnuchess. Usar ^ c na linha de comando parece matar o processo python, mas não o processo gnu.

Por matar gnuchess, recebo o pid com ps aux | grep gnuchess e execute kill -9 PID . Existem outros métodos para matar os processos python e gnuchess?


8
Sidenote aleatória: Você pode usar pkillpara matar um processo pelo nome, para que o seu ps aux | grep gnuchesse kill -9 PIDpode apenas tornarpkill -9 gnuchess
Michael Mrozek

Respostas:


10

Existe um método padrão, se os programas cooperarem. Execute kill -- -42onde 42 é o pid do processo pai. Isso envia um sinal para todos os processos no grupo de processos liderados pelo processo 42 (o sinal de menos antes do pid significa grupo de processos).

Normalmente, se você executar seu script python a partir de um prompt de shell e ele simplesmente se bifurcar gnuchess, os dois processos deverão permanecer no mesmo grupo de processos. Mas esse não parece ser o caso, pois o Ctrl+ Cenvia SIGINTpara todo o grupo de processos em primeiro plano.

O Gnuchess pode estar em seu próprio grupo de processos porque se tornou um líder de sessão (mas não sei por que isso faria isso) ou porque você o bifurcou duas vezes (o python bifurca um shell que bifurca o gnuchess). Um garfo duplo provavelmente é evitável, mas não posso dizer isso sem ver seu código.


Uma maneira razoavelmente confiável e compatível com POSIX de encontrar o pid do gnuchessprocesso é

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

Variantes unix específicas podem ter melhores maneiras de conseguir isso, como pgrep.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.