Mate um processo e force-o a retornar 0 no Linux?

15

No ambiente Linux, como posso enviar um sinal de kill a um processo, certificando-me de que o código de saída retornado desse processo seja 0? Será que eu tenho que fazer alguma fantasia de magia GDB para isso, ou há um sinal de matar que eu não conheço?

Caso de teste:

cat; echo $?

killall cat

Tentar vários sinais de kill apenas oferece diferentes sinais de retorno, como 129, 137 e 143. Meu objetivo é eliminar um processo que um script executa, mas fazer com que o script ache que foi bem-sucedido.

    
por sega01 20.05.2012 / 21:39

5 respostas

18

Você pode anexar ao processo usando o GDB e o ID do processo e, em seguida, emitir o comando call com exit(0) como argumento.

call permite que você chame funções dentro do programa em execução. Chamando exit(0) sai com um código de retorno de 0.

gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)

Program exited normally.

Como ferramenta de uma linha:

gdb --batch --eval-command 'call exit(0)' --pid <process id>
    
por 13.06.2013 / 01:25
8

Não. Quando o shell captura SIGCHLD , ele define incondicionalmente o valor de retorno adequadamente para um valor diferente de zero, portanto, isso exigiria a modificação do script ou do shell.

    
por 20.05.2012 / 22:07
3

Não tenho certeza, mas isso sairá com um 0 se algum dos sinais listados for recebido. Você poderia realizar outras ações, incluindo chamar uma função, etc.

#!/bin/bash 
trap 'exit 0' SIGINT SIGQUIT SIGTERM
    
por 24.07.2014 / 15:01
2

Um pouco hacky, mas ...

Você pode criar um wrapper para o seu processo, substituindo o manipulador SIGCHLD. Por exemplo:

#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand

Depois disso, você pode fazer com que seu script execute este wrapper em vez do seu processo colocando-o anteriormente em $ PATH e renomeando para o mesmo nome.

    
por 21.05.2012 / 07:31
1

Este one-liner funcionou para mim:

/bin/bash -c '/usr/bin/killall -q process_name; exit 0'
    
por 03.03.2015 / 16:14