como obter o PID e o estado de certos processos

0

Eu criei um script de shell básico que simplesmente conta a partir de 1000. Isso é apenas para testes, mas poderia ser qualquer aplicativo / processo.

##filename:test.sh##

#!/bin/bash
i=1000; while [ $i -gt 0 ]; do echo $i; i='expr $i - 1'; sleep 1; done

Eu começo a correr assim:

sh test.sh

Agora preciso obter: a) o pid desse script, b) o estado desse script

Se eu fizer

pidof sh test.sh 

Eu recebo vários resultados embora.

Rodando

ps aux | grep test.sh 

Eu recebo várias entradas, incluindo algumas que são Terminadas (estado = T) e uma que é grep test.sh . Como posso restringir o pidof apenas para o (s) que eu preciso (suponha que seja apenas a instância que está sendo executada)

Eu também preciso do estado. Eu tentei correr:

ps aux | grep test.sh | ps -o stat --no-headers

mas isso não funcionou. Eu obtenho o estado, mas para vários itens

    
por IGGt 05.01.2016 / 15:34

1 resposta

1

pidof -x test.sh deve fornecer o que você precisa para obter o PID.

Na página do manual,

-x Scripts too - this causes the program to also return process id's of shells running the named scripts.

Aqui está o meu teste,

tony@trinity:~$ ls -l testit.sh
-rwxr-xr-x 1 tony tony 83 Jan  5 14:53 testit.sh
tony@trinity:~$ ./testit.sh
1000
999
998
997

enquanto isso

tony@trinity:~$ ps -ef | grep testit.sh
tony      4233 20244  0 14:58 pts/5    00:00:00 /bin/bash ./testit.sh
tony      4295  3215  0 14:58 pts/6    00:00:00 grep --color=auto testit.sh

e depois

tony@trinity:~$ pidof -x testit.sh
4233

Sua consulta posterior é um problema comum, uma solução é

ps aux | grep test.sh | grep -v grep

que deve fornecer apenas uma linha (supondo que test.sh seja exclusivo).

E por último, no seu comando final, você não está apenas passando um único PID, você está passando uma linha inteira de texto, e não é assim que ps espera receber um PID de qualquer maneira (espera que o PID depois de -p ).

Por exemplo,

tony@trinity:~$ ps aux | grep testit.sh
tony      4233  0.1  0.0   4288  1276 pts/5    S+   14:58   0:00 /bin/bash ./testit.sh
tony      5728  0.0  0.0   3476   760 pts/6    S+   15:04   0:00 grep --color=auto testit.sh

Então, precisamos fazer um grep no grep e retornar o pid.

tony@trinity:~$ ps aux | grep testit.sh | grep -v grep | awk '{print $2}'
4233

então,

tony@trinity:~$ ps -o stat --no-headers -p $(ps aux | grep testit.sh | grep -v grep | awk '{print $2}')
S+

Provavelmente há muitas maneiras menos complicadas de chegar lá, mas eu queria mostrar o progresso.

    
por 05.01.2016 / 15:59

Tags