Eu tenho que matar todas as instâncias em execução do Xvfb usando shell script, portanto, tenho o seguinte código -
for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done
Ele mata todas as instâncias, mas uma falha com o seguinte erro -
kill: (142898) - No such process
Parece que o comando executado acima cria mais uma instância, mas que não existe mais durante a matança. Nesse caso, como posso pular isso e ter sucesso com o script?
Responder1
O problema é que você está canalizando a saída ps
para uma chamada awk
que procura a string "Xvfb" e, portanto, também contém a string "Xvfb" em sua própria linha de comando. Como os dois processos de um pipe são executados simultaneamente, a awk
própria chamada também será registrada na saída de ps
(tente o que acontece se você apenas digitar ps -ef | awk '/Xvfb/'
na linha de comando).
No entanto, no momento em que o loop é iniciado (o que acontece quando a substituição do comando $( … )
e, portanto awk
, o processo também é encerrado), esse awk
processo não existe mais e, portanto, kill
ele se depara com isso.
Você deve estar seguro se modificar o comando na substituição de comando para
ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'
o que garantirá que nenhum comando contendo a substring awk
seja incluído na lista.
Responder2
Você está tentando matar o awk
.
Um truque simples de regex para evitar isso é usar algum tipo de escape. Como wor[d]
.
Então, para o seu código (com aspas variáveis adicionadas)
for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done