Script de shell para obter o ID do processo no Linux

Eu quero escrever um script de shell (arquivo .sh ) para obter um determinado id de processo. O que eu estou tentando fazer aqui é quando eu obtiver o ID do processo, eu quero matar esse processo. Estou rodando no Ubuntu (Linux).

Eu consegui fazer isso com um comando como

 ps -aux|grep ruby kill -9  

mas não sei como fazer isso através de um script de shell.

Usar o grep nos resultados do ps é uma má idéia em um script, já que uma parte do tempo também corresponderá ao processo do grep que você acabou de invocar. O comando pgrep evita esse problema, portanto, se você precisar saber o ID do processo, essa é uma opção melhor. (Observe que, é claro, pode haver muitos processos correspondidos.)

No entanto, no seu exemplo, você poderia simplesmente usar o comando pkill semelhante para eliminar todos os processos correspondentes:

 pkill ruby 

Aliás, você deve estar ciente de que usar -9 é um exagero (ho ho) em quase todos os casos – há alguns conselhos úteis sobre isso no texto do “Uso inútil de kill -9 form letter”:

Não não não. Não use kill -9 .

Não dá ao processo uma chance de limpar:

  1. desligar conexões de soquete
  2. limpar arquivos temporários
  3. informar seus filhos que está indo embora
  4. redefinir suas características de terminal

e assim por diante e assim por diante.

Geralmente, envie 15 e espere um segundo ou dois, e se isso não funcionar, envie 2, e se isso não funcionar, envie 1. Se isso não acontecer, REMOVER O BINÁRIO porque o programa está mal comportado!

Não use kill -9 . Não traga a colheitadeira apenas para arrumar o vaso de flores.

Se você vai usar ps e grep então você deve fazer desta forma:

 ps aux|grep r[u]by 

Esses colchetes farão com que o grep pule a linha para o próprio comando grep. Então, para usar isso em um script, faça:

 output=`ps aux|grep r\[u\]by` set -- $output pid=$2 kill $pid sleep 2 kill -9 $pid >/dev/null 2>&1 

Os backticks permitem que você capture a saída de um comando em uma variável do shell. O set -- analisa a saída ps em palavras, e $ 2 é a segunda palavra na linha que é o pid. Então você envia um sinal TERM, espera alguns segundos para o ruby ​​se desligar, então mata impiedosamente se ele ainda existe, mas joga fora qualquer saída porque na maioria das vezes mata -9 reclamará que o processo já está morto .

Eu sei que eu usei isso sem as barras invertidas antes dos colchetes, mas só agora eu verifiquei no Ubuntu 12 e parece exigir deles. Isso provavelmente tem algo a ver com muitas opções do bash e a configuração padrão em diferentes distros do Linux. Espero que o [e] funcione em qualquer lugar, mas eu não tenho mais access aos servidores onde sei que funcionou sem barra invertida, por isso não posso ter certeza.

Um comentário sugere grep-v e é isso que eu costumava fazer, mas quando soube da variante [], decidi que era melhor gerar um processo a menos no pipeline.

Como um começo, não há necessidade de fazer um ps -aux | grep... ps -aux | grep... O comando pidof é muito melhor de usar. E quase nunca kill -9 vê aqui

para obter a saída de um comando no bash, use algo como

 pid=$(pidof ruby) 

ou use pkill diretamente.

A opção -v é muito importante. Pode excluir uma expressão grep

por exemplo

 ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id 

Isso funciona no Cygwin, mas deve ser efetivo no Linux também.

 ps -W | awk '/ruby/,NF=1' | xargs kill -f 

ou

 ps -W | awk '$0~z,NF=1' z=ruby | xargs kill -f 

Armadilhas de Bash

Você pode usar o comando killall :

 $ killall ruby 

É bem simples. Basta executar qualquer programa como este: – x = gedit & echo $! isso lhe dará PID deste processo. então faça isso matar -9 $ x

Para matar o processo no shell

 getprocess=`ps -ef|grep servername` #echo $getprocess set $getprocess pid=$2 #echo $pid kill -9 $pid 

Se você já conhece o processo, isso será útil:

 PID=`ps -eaf | grep  | grep -v grep | awk '{print $2}'` if [[ "" != "$PID" ]]; then echo "killing $PID" kill -9 $PID fi