Identyfikator procesu przy użyciu ps aux

9

Jestem nowicjuszem w programowaniu powłoki. Zakładając, że uruchomiłem program (np. NetBeans) z mojego terminala, jeśli piszę

ps aux|grep netbeans

Dostaję wynik

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

gdzie 18775 określa PID itp. procesu.

Potem zabijam go za pomocą

kill 18775.

na którym znika interfejs użytkownika NetBeans. Jeśli spróbuję uzyskać pid za pomocą pierwszego polecenia, nadal otrzymuję:

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

Jeśli proces został zabity, dlaczego nadal wyświetla powyższą informację wyjściową?

P Ramesh
źródło
1
Nie pokazuje ci procesu netbeans - pokazuje proces grep, przez który przepływa ps aux! Ponieważ ten proces jest grep netbeans, to jest program, który widzisz na końcu wiersza ( grep --color=auto netbeans)
David Puglielli,

Odpowiedzi:

16

grep samo grepping. Wypróbuj coś takiego:

ps aux |grep [n]etbeans

dzięki temu grep nie pokazuje się na wyjściu

roadmr
źródło
2
To działa, ale nie jest bardzo miłe. Ty też możesz to zrobić ps aux | grep netbeans | grep -v grep. Zamiast tego użyj pgrep.
Martin Ueding
1
@queueoverflow pgrepbyłoby miło, ale pasuje tylko do nazwy procesu. Pierwszy wzór może pasować do dowolnej kolumny ps. (Na przykład coś działa pod python lub java, pgrep nie byłoby rzeczą właściwą grepping samo z. pkillI tak dalej ..)
Izkata
5

Nigdy nie używaj psrazem z grep.

Zamiast tego użyj killall netbeans, pkill netbeansaby go zabić. Dla identyfikatora procesu pgrep netbeans.

Więcej na temat ps i grep .

Martin Ueding
źródło
5
To najbardziej bezużyteczna rada, jaką kiedykolwiek słyszałem. Tak długo, jak ludzie wiedzą, jak będzie wyglądał proces grep w danych wyjściowych ps (zaczyna się od „grep”), nie ma absolutnie żadnego niebezpieczeństwa przy korzystaniu z nich razem. Rozumiem radę, aby nie używać zabicia w skrypcie, ale to nie ma znaczenia.
ovangle 17.11.11
3
I myślę, że pgrep jest gorszy, ponieważ błaga cię o „zabicie $ (pgrep vi *)” lub coś niesamowicie niebezpiecznego.
ovangle 17.11.11
1
Jest to również najbardziej bezużyteczna odpowiedź na tej stronie, ponieważ pgrep, pkilli tak dalej tylko w przypadku dopasowania nazwy procesu - wszystko, co jest interpretowane (java, python, bash itp.), Można odróżnić od innych pod tą samą nazwą procesu za pomocą ps.
Izkata,
3
@Izkata - użycie -f dla pgrep i pkill będzie zgodne z całym wierszem poleceń. Czasami jest to przydatne, gdy próbujesz dopasować rzeczy działające pod tłumaczami, jak wspomniałeś. To także dobry sposób na zastrzelenie się w stopę, ponieważ z radością zabije wszystko, co odwołuje się do Twojego wzoru w dowolnym miejscu w wierszu poleceń :)
roadmr
4

Ponieważ jest to PID dla procesu grep, który jest w kolejce do uruchomienia ps aux.

owal
źródło
@ ovangle- blink Nigdy o tym nie myślałem! : D dzięki!
P Ramesh,
1
W rzeczywistości grepdziała już po ps auxuruchomieniu. Podczas działania ps auxjego dane wyjściowe są wysyłane do działającej grepinstancji jako dane wejściowe. Gdyby powłoka grepjeszcze się nie wykonała , nie pojawiłaby się na wyjściu ps.
Eliah Kagan