Eliminar instâncias de processos em execução, exceto aquelas que são acionadas devido ao comando atual executado

Eliminar instâncias de processos em execução, exceto aquelas que são acionadas devido ao comando atual executado

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 pspara uma chamada awkque 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 awkpró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 awkprocesso não existe mais e, portanto, killele 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 awkseja 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

informação relacionada