Como matar processos com segurança para que o redirecionamento de saída não seja abortado?

1

Estou escrevendo alguns scripts de automação, nos quais preciso matar alguns processos.

Anteriormente, normalmente usava kill -9 pid para matar processos, mas uma vez, observei que quando usei kill -9 para matar alguns processos tcpdump :

Por exemplo:

tcpdump -i eth0 -w output.pcap

Os pacotes capturados não foram colocados em output.pcap e estavam vazios. Mas se eu usei kill , funcionou bem.

Para alguns processos, como ./prog >> test_log , temo que se eu usar kill -9 para eliminar os processos, a saída não será redirecionada para test_log .

Eu também tenho medo se eu usar kill sem -9 o comando kill pode falhar.

Alguém pode me dizer como usar corretamente kill para que a matança não cause problemas com o arquivo de saída e eu seja capaz de matar os processos sem problemas?

    
por misteryes 11.05.2013 / 20:54

2 respostas

3

Se um processo não gravar em um terminal, mas usar o redirecionamento (ou mesmo quando escrever explicitamente em um arquivo), o buffer pode ser um problema. Dê uma olhada em stdbuf e unbuffer ( expect ) ou procure aqui por eles.

Seu problema tcpdump pode ser resolvido (ou reduzido) pelo sinalizador -U .

Em geral, você deve matar assim:

kill $PID; sleep $wait; kill -9 $pid &>/dev/null

kill / kill -TERM dá ao processo a chance de terminar de forma limpa (incluindo, por exemplo, liberar buffers e fechar descritores de arquivo) enquanto kill -KILL apenas remove o processo da memória e da lista de processos que é sempre um risco com operações atômicas que podem estar em andamento imediatamente.

    
por 11.05.2013 / 22:12
1

Você deve começar com a emissão de uma ordem de morte de 15 wait, se não for terminada, kill 2 , etc.

Em geral, a execução normal, com exceções, não é o melhor sinal se um programa não terminar após o kill 15,2,1. Embora você não possa esperar que termine imediatamente.

Em segundo lugar, depende do programa específico que você mata. Alguns programas pegam e limpam, outros deveriam ter feito, mas não, outros não têm nada para limpar e deixar para o sistema operacional para limpar depois. Etc.

Você também deve (sempre) verificar se há outros sinais que você pode enviar para o aplicação ou se é um deamon, pelo qual você geralmente tem um script start / stop etc.

Veja também:

por 11.05.2013 / 22:20

Tags