Ich werde Sie durch ein etwas komplexes Beispiel führen, das auf einem realen Szenario basiert.
Problem
Angenommen, der Befehl conky
reagiert auf meinem Desktop nicht mehr und ich möchte ihn manuell beenden. Ich kenne ein bisschen Unix, also weiß ich, dass ich den Befehl ausführen muss kill <PID>
. Um die PID abzurufen, kann ich verwenden ps
oder top
oder was auch immer Werkzeug meiner Unix - Distribution mir gegeben hat. Aber wie kann ich das mit einem Befehl machen?
Antworten
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
HAFTUNGSAUSSCHLUSS: Dieser Befehl funktioniert nur in bestimmten Fällen. Kopieren Sie es nicht in Ihr Terminal und fangen Sie nicht an, es könnte Prozesse ahnungslos abbrechen. Lerne lieber, wie man es baut .
Wie es funktioniert
1- ps aux
Dieser Befehl gibt die Liste der ausgeführten Prozesse und einige Informationen dazu aus. Die interessante Info ist, dass es die PID jedes Prozesses in seiner 2. Spalte ausgibt. Hier ist ein Auszug aus der Ausgabe des Befehls auf meiner Box:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Ich interessiere mich nur für einen Prozess, daher suche ich grep
den Eintrag, der meinem Programm entspricht conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
Wie Sie in Schritt 2 sehen können, gibt der Befehl ps
den grep conky
Prozess in seiner Liste aus (es ist immerhin ein laufender Prozess). Um es zu filtern, kann ich laufen grep -v grep
. Die Option -v
sagt grep
alle Linien passen ohne diejenigen , die Muster enthalten.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Ich würde gerne wissen, wie Sie die Schritte 2 und 3 in einem einzigen grep
Anruf ausführen können.
4- awk '{print $2}'
Jetzt habe ich meinen Zielprozess isoliert. Ich möchte die PID abrufen. Mit anderen Worten, ich möchte das 2. Wort der Ausgabe abrufen. Glücklicherweise bieten die meisten (alle?) Modernen Unices eine Version von awk
, einer Skriptsprache, die mit tabellarischen Daten Wunder vollbringt. Unsere Aufgabe wird so einfach wie print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Ich habe die PID. Ich muss es nur weitergeben kill
. Dazu werde ich verwenden xargs
.
xargs kill
liest aus der Eingabe (in unserem Fall aus der Pipe), bildet einen Befehl , der aus kill <items>
( <items>
was auch immer aus der Eingabe gelesen wird) besteht, und führt dann den erstellten Befehl aus. In unserem Fall wird es ausgeführt kill 1948
. Mission erfüllt.
Letzte Worte
Beachten Sie, dass sich bestimmte Programme je nach verwendeter Unix-Version möglicherweise etwas anders verhalten (z. B. ps
die PID in Spalte $ 3 ausgeben). Wenn etwas falsch oder anders scheint, lesen Sie die Dokumentation Ihres Anbieters (oder besser die man
Seiten). Seien Sie auch vorsichtig, da lange Rohre gefährlich sein können. Machen Sie keine besonderen Annahmen, wenn Sie Befehle wie kill
oder verwenden rm
. Wenn es beispielsweise einen anderen Benutzer mit dem Namen "conky" (oder "Aconkyous") gab, kann mein Befehl auch alle laufenden Prozesse beenden!
Was ich sage, ist Vorsicht, besonders bei langen Rohren. Es ist immer besser, es interaktiv aufzubauen, als Annahmen zu treffen und sich später zu entschuldigen.