ID do processo usando ps aux

9

Eu sou um novato na programação de shell. Supondo que iniciei um programa (por exemplo, NetBeans) no meu terminal, se eu digitar

ps aux|grep netbeans

Eu recebo a saída

pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 

onde 18775 especifica o PID etc. do processo.

Então eu mato usando

kill 18775.

no qual a interface do usuário do NetBeans desaparece. Se eu tentar obter o pid usando o primeiro comando, ainda recebo:

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

Se o processo foi interrompido, por que ainda mostra a saída acima?

P Ramesh
fonte
11
Não está mostrando o processo netbeans - está mostrando o processo grep através do qual o ps aux está sendo canalizado! Desde que o processo é grep netbeans, esse é o programa que você vê no final da linha ( grep --color=auto netbeans)
David Puglielli

Respostas:

15

grep está se cumprimentando. Tente algo como:

ps aux |grep [n]etbeans

isso evita que o grep se mostre na saída

roadmr
fonte
2
Isso funciona, mas não é muito bom. Você também poderia fazer ps aux | grep netbeans | grep -v grep. Mas use o pgrep.
Martin Ueding 17/11/11
11
@queueoverflow pgrepseria bom, mas corresponde apenas ao nome do processo. O primeiro padrão pode corresponder a qualquer coluna de ps. (Por exemplo, algo que funciona sob python ou java, pgrep não seria grepping a coisa correta Mesmo com. pkillE assim por diante ..)
Izkata
5

Nunca use psjunto com grep.

Em vez disso, use killall netbeans, pkill netbeanspara matá-lo. Para o ID do processo pgrep netbeans.

Mais sobre ps e grep .

Martin Ueding
fonte
5
Esse é o conselho mais inútil que eu já ouvi. Desde que as pessoas saibam como será o processo grep na saída do ps (ele começa com "grep"), não há absolutamente nenhum perigo em usar os dois juntos. Eu entendo o conselho de não usar um kill em um script, mas isso não vem ao caso.
Ovangle
3
E acho que o pgrep é pior, porque está apenas implorando para que você 'mate $ (pgrep vi *)' ou algo incrivelmente inseguro assim.
Ovangle
11
Esta é também a resposta mais inútil nesta página, como pgrep, pkille assim por diante, apenas o nome do processo de correspondência - tudo o que estiver sendo interpretado (java, python, bash, etc ...) só pode ser diferenciado dos outros sob o mesmo nome de processo usando ps.
Izkata
3
@ Izkata - usar -f para pgrep e pkill corresponderá à linha de comando inteira. Às vezes, é útil ao tentar combinar coisas executadas sob intérpretes, como você mencionou. É também uma boa maneira de atirar no próprio pé, uma vez que terá todo o prazer matar qualquer coisa que as referências seu lugar padrão em sua linha de comando :)
roadmr
4

Porque esse é o PID do processo grep que está na fila para execução posterior ps aux.

ovangle
fonte
@ ovangle- piscar Eu nunca pensei nisso! : D obrigado!
precisa
11
Na verdade, grep está sendo executado quando ps auxé executado. Conforme ps auxexecutado, sua saída é enviada para a grepinstância em execução como entrada. Se o shell ainda não tivesse sido executado grep, não apareceria na saída de ps.
Elias Kagan 03/03