Como parar o processo de execução no Linux

1

Eu tenho um arquivo de script pingIP.sh que apenas pinga o endereço IP fornecido,

ping -c 70 74.125.228.71

O problema é que quando eu tento parar o script executado no meio, ele não o interrompe corretamente.

Usando o linux cmd ps -ef|grep pingIP |grep -v 'grep pingIP' Consigo obter o ID do processo e eliminá-lo usando cmd kill -9 processid .

Por exemplo, executando o arquivo de script

PING 74.125.228.71 (74.125.228.71) 56(84) bytes of data.
64 bytes from 74.125.228.71: icmp_seq=1 ttl=122 time=256 ms
64 bytes from 74.125.228.71: icmp_seq=2 ttl=122 time=244 ms
64 bytes from 74.125.228.71: icmp_seq=3 ttl=122 time=250 ms
64 bytes from 74.125.228.71: icmp_seq=4 ttl=122 time=254 ms
64 bytes from 74.125.228.71: icmp_seq=5 ttl=122 time=243 ms

A execução do comando kill agora interrompe a execução do script, mas a resposta do ping continua até que a contagem de ping especificada seja atingida.

Alguma sugestão para evitar a execução do ping mesmo após parar a execução do arquivo de script?

    
por sureshd 11.06.2013 / 11:10

4 respostas

1

Se você quiser eliminar o processo do shell e qualquer outro processo gerado, provavelmente é melhor iniciar um novo grupo de processos ( setpgid() no filho após o fork() antes de executar o execve() no script) e mate o grupo de processos com kill(-pid) , em que pid é o valor de retorno de fork() no pai.

Se chamar setpgid() não for uma opção, você ainda pode fazer isso:

Em vez de:

run("your-script its args");

Faça:

run("set -m; trap 'kill %' TERM; your-script its args & wait")
    
por 11.06.2013 / 13:59
1

Normalmente, seria Ctrl+C na chamada invocar / matar o processo do processo pai enviando um sinal via Process.destroy() (Java).

Uma ferramenta simples para essas tarefas é pkill , o que pode matar processos por um padrão, por exemplo

pkill ping

Observe que um usuário normal não pode matar outros processos de usuários, portanto, verifique se você está conectado no computador certo com o ID de usuário correto.

Dica de bônus: use pgrep -fl ping para listar processos correspondentes, para ter certeza de que você quer matar todos eles - porque executando como root, pkill ssh irá também matar seu sshd e pode trancar você. Então, em particular quando rodando como root - o que você deve evitar de qualquer forma - verifique com pgrep .

    
por 11.06.2013 / 11:14
0

Use o killall. Por ex. "killall scriptname". killall mata um processo pelo nome. Além disso, você também pode emitir sinal como. SIGKILL, SIGSTOP, etc.

    
por 11.06.2013 / 11:52
0

Obtenha o ID do processo como você escreveu:

ps -ef|grep pingIP |grep -v 'grep pingIP'

e depois matar o processo de crianças usando

pkill -P process-id
    
por 11.06.2013 / 13:39

Tags