Prozess-ID mit ps aux

9

Ich bin ein Neuling in der Shell-Programmierung. Angenommen, ich habe ein Programm (z. B. NetBeans) von meinem Terminal aus gestartet, wenn ich tippe

ps aux|grep netbeans

Ich bekomme die Ausgabe

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

Dabei gibt 18775 die PID usw. des Prozesses an.

Dann töte ich es mit

kill 18775.

woraufhin die NetBeans-Benutzeroberfläche verschwindet. Wenn ich versuche, die PID mit dem ersten Befehl zu erhalten, erhalte ich immer noch:

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

Wenn der Prozess abgebrochen wurde, warum wird die obige Ausgabe immer noch angezeigt?

P Ramesh
quelle
1
Es zeigt Ihnen nicht den NetBeans-Prozess - es zeigt den Grep-Prozess, durch den ps aux geleitet wird! Da dieser Prozess ist grep netbeans, ist das das Programm, das Sie am Ende der Zeile sehen ( grep --color=auto netbeans)
David Puglielli

Antworten:

15

grep greift nach sich selbst. Versuchen Sie etwas wie:

ps aux |grep [n]etbeans

Dies verhindert, dass sich grep in der Ausgabe zeigt

Roadmr
quelle
2
Das funktioniert, ist aber nicht sehr schön. Sie könnten auch tun ps aux | grep netbeans | grep -v grep. Verwenden Sie stattdessen pgrep.
Martin Ueding
1
@queueoverflow pgrepwäre schön, aber es stimmt nur mit dem Prozessnamen überein. Das erste Muster kann mit jeder Spalte von übereinstimmen ps. (Zum Beispiel, etwas, das unter Python oder Java läuft, würde pgrep nicht das Richtige greifen. Gleiches mit pkillund so weiter.)
Izkata
5

Nie verwenden pszusammen mit grep.

Verwenden Sie es eher killall netbeans, pkill netbeansum es zu töten. Für die Prozess-ID pgrep netbeans.

Mehr zu ps und grep .

Martin Ueding
quelle
5
Das ist der nutzloseste Rat, den ich je gehört habe. Solange die Leute wissen, wie der grep-Prozess in der Ausgabe von ps aussehen wird (er beginnt mit "grep"), besteht absolut keine Gefahr, die beiden zusammen zu verwenden. Ich verstehe den Rat, keinen Kill in einem Skript zu verwenden, aber das ist nebensächlich.
ovangle
3
Und ich denke, pgrep ist schlimmer, weil es dich nur bittet, '$ (pgrep vi *) zu töten' oder so etwas erstaunlich Unsicheres.
ovangle
1
Dies ist auch die nutzloseste Antwort auf dieser Seite, da pgrep, pkillund so weiter, nur der Name des Übereinstimmungsprozesses - alles, was interpretiert wird (Java, Python, Bash usw.), kann nur unter Verwendung des gleichen Prozessnamens von anderen unterschieden werden ps.
Izkata
3
@Izkata - Die Verwendung von -f für pgrep und pkill stimmt mit der gesamten Befehlszeile überein. Es ist manchmal nützlich, wenn Sie versuchen, Dinge abzugleichen, die unter Dolmetschern ausgeführt werden, wie Sie bereits erwähnt haben. Es ist auch eine gute Möglichkeit, sich in den Fuß zu schießen, da es glücklich alles tötet, was irgendwo in seiner Befehlszeile auf Ihr Muster verweist :)
Roadmr
4

Denn das ist die PID für den grep-Prozess, der in die Warteschlange gestellt wird, um danach ausgeführt zu werden ps aux.

ovangle
quelle
@ ovangle- blink Ich habe nie daran gedacht! : D danke!
P Ramesh
1
Eigentlich grepist bereits läuft , wenn ps auxläuft. Während ps auxder Ausführung wird die Ausgabe grepals Eingabe an die laufende Instanz gesendet . Wenn die Shell noch nicht ausgeführt grepworden wäre, würde sie nicht in der Ausgabe von angezeigt ps.
Eliah Kagan