Eu coloquei um comando em um script bash para matar processos como abaixo
#!/bin/bash
kill -9 $(ps ux | grep 'fluent' | awk '{print $2}')
À medida que executo o script, por exemplo ./mykill
, não tem efeito
$ ps ux | grep fluent
ko 21690 0.0 0.0 112664 972 pts/3 S+ 15:28 0:00 grep --color=auto fluent
ko 26573 5.1 1.0 1743688 673592 ? Sl May14 836:08 /state/partition1/ans190/v190/fluent/cortex.19.0.0 -f fluent -cmd-port:35881:compute-0-4.local -workbench-session (fluent "3ddp -pshmem -host -alnamd64 -r19.0.0 -t16 -mpi=ibmmpi -path/state/partition1/ansys190/v190/fluent -ssh")
ko 26581 0.0 0.0 0 0 ? Z May14 0:00 [fluent] <defunct>
$
$
$ ~/mykill
Killed
$ ps ux | grep fluent
ko 21690 0.0 0.0 112664 972 pts/3 S+ 15:28 0:00 grep --color=auto fluent
ko 26573 5.1 1.0 1743688 673592 ? Sl May14 836:08 /state/partition1/ans190/v190/fluent/cortex.19.0.0 -f fluent -cmd-port:35881:compute-0-4.local -workbench-session (fluent "3ddp -pshmem -host -alnamd64 -r19.0.0 -t16 -mpi=ibmmpi -path/state/partition1/ansys190/v190/fluent -ssh")
ko 26581 0.0 0.0 0 0 ? Z May14 0:00 [fluent] <defunct>
No entanto, se eu executar o comando no terminal, ele os matará.
$ kill -9 $(ps ux | grep 'fluent' | awk '{print $2}')
-bash: kill: (21899) - No such process
$ ps ux | grep fluent
ko 21915 0.0 0.0 112664 972 pts/3 S+ 15:31 0:00 grep --color=auto fluent
Qual é o motivo então?
Existem vários problemas com sua abordagem.
A maneira como você detecta processos não é confiável. Um processo pode ter
fluent
em sua linha de comando mesmo que não seja aquele que você queria matar. Por exemplo, se você chamar seu scriptkill-fluent
, ele se matará. Nunca mate um processo apenas com base em seu nome . É muito pouco confiável.A melhor maneira de matar um processo é usar seu próprio mecanismo de controle remoto para enviar um comando de saída. Se isso não for possível, mate-o com base em quais arquivos ele abriu com
fuser
. A execução de um binário conta como tê-lo aberto. Por exemplo, para matar todos os processos que estão executando/usr/bin/fluent
, executefuser -k /usr/bin/fluent
.Nos casos em que você realmente precisa matar um processo com base em sua linha de comando, não use
grep
.ps … | grep …
pode incluir o processo grep: ops
comando e ogrep
comando são executados em paralelo, portanto,ps
podem ou não listargrep
dependendo da velocidade relativa na qual os dois processos iniciam. Usepkill
em vez disso.Quanto aos
<defunct>
processos, esqueça de matá-los: eles já estão mortos. Isso é o que “defunto” significa: eles são zumbis .