Ich führe aus ps -ejH | less
. Die Ausgabe enthält außerdem ps
und .less
Was ist der Grund? Ich dachte, es würde folgendermaßen funktionieren:
- Zuerst
ps
wird es ausgeführt und es werden alle zu diesem Zeitpunkt vorhandenen Prozesse aufgelistet. - Dann
ps
wird die Ausgabe von in eingespeistless
.
Aber gemäß dieser Logik sollte weder „ ps
not“ less
in der Ausgabe von erscheinen ps
.
Warum sind diese Prozesse also in der Ausgabe von enthalten ps
? ps
Funktioniert es etwas anders, als ich es beschrieben habe?
Antwort1
DerHülseBeginnt man beide Enden der Leitung, ps
sieht man sich selbst sowie den Vorgang am anderen Ende der Leitung.
Antwort2
„Aber dieser Logik zufolge sollte in der Ausgabe von ps weder ps noch less erscheinen.“
Ja, Ihre Logik ist also falsch, weil beide vorkommen. Wenn Sie einen Befehl in einer Un*x-Shell ausführen, werden nur sehr wenige (wenn überhaupt) tatsächlich in der Shell ausgeführt. Um diesen Befehl auszuführen, wird ein separater Prozess geforkt.
Wenn Sie zwei Befehle zusammen über eine Pipe weiterleiten, werden beide Befehle in separaten Prozessen gestartet und die Standardausgabe des ersten Befehls wird mit der Standardeingabe des zweiten Befehls verknüpft.
Kurz nachdem Sie ps|less ausgeführt haben, haben Sie also drei Prozesse: einen, der Ihre Shell ausführt, einen, der ps ausführt, und einen, der less ausführt. Da die Ausgabe von ps generiert wird, wird sie parallel (nach Bedarf in Zeitscheiben aufgeteilt) von less bearbeitet. Beide Befehle werden parallel und nicht nacheinander ausgeführt, mit minimaler Pufferung.
Während ps die Prozessliste durchläuft, findet und zeigt es sowohl sich selbst als auch less an, außerdem die übergeordnete Shell und die übergeordnete Shell des übergeordneten Elements und so weiter bis zu init. Und alles andere auf dem System. Deshalb enthält Ihre Ausgabe sowohl ps als auch less.
Antwort3
Verwenden
ps -ef | grep [l]ess
weniger zu vermeiden.
[l]ess
Übereinstimmungless
als regulärer Ausdruck, aber nicht als feste Zeichenfolge.