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?
command-line
P Ramesh
quelle
quelle
grep netbeans
, ist das das Programm, das Sie am Ende der Zeile sehen (grep --color=auto netbeans
)Antworten:
grep greift nach sich selbst. Versuchen Sie etwas wie:
Dies verhindert, dass sich grep in der Ausgabe zeigt
quelle
ps aux | grep netbeans | grep -v grep
. Verwenden Sie stattdessen pgrep.pgrep
wäre schön, aber es stimmt nur mit dem Prozessnamen überein. Das erste Muster kann mit jeder Spalte von übereinstimmenps
. (Zum Beispiel, etwas, das unter Python oder Java läuft, würde pgrep nicht das Richtige greifen. Gleiches mitpkill
und so weiter.)Nie verwenden
ps
zusammen mitgrep
.Verwenden Sie es eher
killall netbeans
,pkill netbeans
um es zu töten. Für die Prozess-IDpgrep netbeans
.Mehr zu ps und grep .
quelle
pgrep
,pkill
und 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 werdenps
.Denn das ist die PID für den grep-Prozess, der in die Warteschlange gestellt wird, um danach ausgeführt zu werden
ps aux
.quelle
grep
ist bereits läuft , wennps aux
läuft. Währendps aux
der Ausführung wird die Ausgabegrep
als Eingabe an die laufende Instanz gesendet . Wenn die Shell noch nicht ausgeführtgrep
worden wäre, würde sie nicht in der Ausgabe von angezeigtps
.