Pipe todos os processos suspensos para matar

3

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

./toplog.sh

Suspensão:

Ctrl-Z

Listagem de 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

Matança:

kill 12055 12752 13276 13579
    
por Sudip Bhandari 22.10.2016 / 11:41

2 respostas

4

I am running a script which has to be suspended before killing.

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

The first time I run it there is only one pid for the process. I kill it and run again and the number of PID goes increasing.

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

O motivo pelo qual você não conseguiu matar os trabalhos é provavelmente porque eles estão suspensos. Quando um processo é suspenso, ele não pode 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), obviamente, acorda o processo imediatamente. Outra categoria de exceções são 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 %1 matar o trabalho 1, o shell informará que o trabalho foi encerrado. Se o processo definiu um manipulador para SIGTERM, então kill %1 não terá efeito enquanto o processo estiver suspenso; para matar o processo, você também precisa retomá-lo:

kill %1; kill -CONT %1

Se você quiser forçar a eliminação do processo sem dar a oportunidade de limpeza, faça

kill -KILL %1

(ou kill -9 %1 para breve).

Se você quiser matar todos os processos toplog.sh , se eles foram lançados deste terminal ou não, você pode usar pkill toplog.sh .

    
por 23.10.2016 / 00:44
0

Você pode matar todas as instâncias do seu script quando souber como 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

ps x está fornecendo uma lista de todos os seus processos em que o processo de destino será exibido. O segundo grep apenas remove a própria chamada grep da lista. Caso contrário, você recebe um erro (que, na verdade, ainda não é problema, mas é feio). cut -d "" -f1 corta cada linha em múltiplas partes divididas por caracteres de espaço, onde * -f1 ** pega a primeira parte. xargs kill -9 mata todos os pid que são lançados fora da cadeia de comandos antes.

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

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

O script é então chamado com o nome do processo a ser eliminado.

./kill.sh toplog.sh
    
por 22.10.2016 / 14:26