Pipe todos os processos suspensos para matar

Pipe todos os processos suspensos para matar

Estou executando um script que deve ser suspenso antes de matar. Na primeira vez que executo, há apenas um pid para o processo. Eu mato e corro novamente e o número de PID vai aumentando. Primeiro de tudo, por que esse comportamento? E como posso eliminar todos os processos suspensos sem mencionar explicitamente cada PID?

./toplog.sh

Suspensão:

Ctrl-Z

Listando processos suspensos:

jobs -l

Saída:

[1]  12055 Stopped                 ./toplog.sh
[2]  12752 Stopped                 ./toplog.sh
[3]- 13276 Stopped                 ./toplog.sh
[4]+ 13579 Stopped                 ./toplog.sh

Matando:

kill 12055 12752 13276 13579

Responder1

Estou executando um script que deve ser suspenso antes de matar.

Oh não. Um script não precisa ser suspenso antes de ser morto. Você pode matá-lo a qualquer momento.

Na primeira vez que executo, há apenas um pid para o processo. Eu mato e corro novamente e o número de PID vai aumentando.

Então você não está realmente matando-o! Se você executá-lo ./toplog.she suspendê-lo, isso criará apenas um único trabalho, ou seja, uma única linha na saída de jobs. O script em si pode criar vários processos, mas jobsapenas lista o próprio script (o líder do grupo de processos, em termos técnicos). Se você vir mais e mais empregos, isso significa que ainda está vendo os empregos antigos que tentou, sem sucesso, eliminar.

A razão pela qual você não conseguiu eliminar os empregos é provavelmente porque eles estão suspensos. Quando um processo é suspenso, ele não consegue reagir aos sinais. Se você enviar um sinal para um processo suspenso, o sinal só terá efeito quando o processo for retomado. As exceções são sinais que são gerenciados diretamente pelo kernel, sem envolver o processo. Uma dessas exceções é o sinal para retomar um processo (SIGCONT), que obviamente ativa o processo imediatamente. Outra categoria de exceções são os sinais que matam o processo sem perguntar: isso sempre inclui SIGKILL, e também inclui outros sinais (SIGINT, SIGHUP, SIGTERM, SIGQUIT, …) se o processo não tiver definido um manipulador para esse sinal.

Se kill %1matar o trabalho 1, o shell informará que o trabalho foi encerrado. Se o processo tiver definido um manipulador para SIGTERM, então kill %1não terá efeito enquanto o processo estiver suspenso; para encerrar o processo, você também precisa retomá-lo:

kill %1; kill -CONT %1

Se você quiser forçar o encerramento do processo sem dar a ele qualquer oportunidade de limpeza, faça

kill -KILL %1

(ou kill -9 %1para abreviar).

Se você quiser encerrar todos os toplog.shprocessos, sejam eles iniciados a partir deste terminal ou não, você pode usar pkill toplog.sh.

Responder2

Você pode eliminar todas as instâncias do seu script quando souber como o seu processo é chamado durante o tempo de execução (neste exemplo, toplog.sh).

ps x | grep toplog.sh | grep -v grep | cut -d" " -f1 | xargs kill -9

obs: xestá fornecendo uma lista de todos os seus processos onde o processo de destino será recebido. O segundo grep apenas remove a própria chamada grep da lista. Caso contrário, você receberá um erro (o que na verdade ainda não é problema, mas é feio).cortar -d" " -f1corta cada linha em múltiplas partes divididas por caracteres de espaço, onde *-f1** ocupa a primeira parte.xargs matar -9mata todos os pid que foram expulsos da cadeia de comando antes.

Por conveniência, você pode colocar esta linha em um script kill, onde o nome do processo é substituído pelo argumento do script kill:

#!/bin/bash
ps x | grep $1 | grep -v grep | cut -d" " -f1 | xargs kill -9

O script é então chamado com o nome dos processos a serem eliminados.

./kill.sh toplog.sh

informação relacionada