Timing von ps zu grep geleitet

7

Das ist also kein Problem als solches, nur etwas, worauf ich neugierig bin. Ich verwende Linux Mint MATE, das von Debian abgezweigt ist. Wenn ich mache:

ps afx  | grep abcdefg

Ich bekomme:

16599 pts/3    S+     0:00  |   \_ grep --color=auto abcdefg

Es zeigt also den Prozess für den Grep. Aber das ist nach dem psin der Pipe: Ich hätte gedacht, dass das oben genannte das tut ps, die Ergebnisse erhält und sie dann an weitergibt grep. Wie kommt es also, dass das greptatsächlich in den psErgebnissen auftaucht ? Passiert es nicht danach? Ich glaube, mir fehlt etwas Grundlegendes an dem, was die Pfeife tatsächlich tut.

Max Williams
quelle

Antworten:

4

Diese Frage ist ein Duplikat und gehört zu unix.stackexchange.com.

Zusammenfassend lässt sich sagen, dass das Shell Command Language- Dokument der OpenGroup in Bezug auf " Pipelines " relativ vage ist :

Eine Pipeline ist eine Folge von einem oder mehreren Befehlen, die durch den Steueroperator '|' getrennt sind. Die Standardausgabe aller Befehle bis auf den letzten wird mit der Standardeingabe des nächsten Befehls verbunden.

Das Format für eine Pipeline lautet:

[!] command1 [ | command2 ...]

Die Standardeingabe von Befehl1 ist mit der Standardeingabe von Befehl2 zu verbinden. Die Standardeingabe, die Standardausgabe oder beide Befehle gelten vor jeder Umleitung, die von Umleitungsoperatoren angegeben wird, die Teil des Befehls sind, als von der Pipeline zugewiesen (siehe Umleitung).

Befindet sich die Pipeline nicht im Hintergrund (siehe Asynchrone Listen), wartet die Shell auf den Abschluss des zuletzt in der Pipeline angegebenen Befehls und möglicherweise auch auf den Abschluss aller Befehle.

Beachten Sie, dass die Daten in der Pipeline zwar eindeutig von "links nach rechts" fließen, es jedoch keine Garantie für die Planung selbst gibt.

Siehe auch:

Haylem
quelle
2

Die Planung spielt überhaupt keine Rolle. Wenn Sie eine Stunde lang Rohrleitungen in Betracht ziehen, bleibt die Rohrleitung vom Start des ersten Programms bis zum Ende des Programms kontinuierlich geöffnet. Das zweite Programm läuft genau zur gleichen Zeit wie das erste und beide werden (im Allgemeinen) zur gleichen Zeit beendet.

Mit anderen Worten, ps erhält die Ausgabe nicht und sendet sie dann an grep - die beiden werden gleichzeitig ausgeführt, und die Ausgabe von eins wird in Echtzeit in die zweite eingegeben . Es wartet nicht darauf, dass das erste Programm beendet ist, sammelt eine Stunde Daten und sendet dann alles auf einmal an das zweite.

In der Praxis gibt es jedoch eine gewisse Pufferung (einige hundert Zeichen), insbesondere wenn mehrere Pipes beteiligt sind. Aber denken Sie größtenteils daran, dass beide gleichzeitig ausgeführt werden und direkt miteinander sprechen.

Zirkus Cat
quelle
danke - ich habe gelernt, dass aus der Antwort auf die Frage dies ein Betrug ist :)
Max Williams
0

Ich denke, hier ist ein gewisses Timing erforderlich.

mkfifo /tmp/pipe
echo  >/tmp/pipe

(Shell-Prozess ist aufgehängt)

Es spielt keine Rolle, was zuerst gestartet wird, da der Schreiber sowieso blockiert, bis ein Leser sein Ende öffnet. Da praktisch jedes vernünftige Unix-Programm E / A initiiert, bevor es sich um etwas anderes kümmert, psbleibt es hängen, bis der grepProzess so weit etabliert ist, dass er zumindest am Leseende dieser Pipe geöffnet wird.

cat </tmp/pipe &
echo >/tmp/pipe

(diesmal nicht hängen)

Diese Reihenfolge bedeutet, dass Sie immer w / a grepdort landen .

Es gibt jedoch auch andere Möglichkeiten.

Wenn Sie beispielsweise nach dem argv0 eines laufenden Prozesses mit einer GNU suchen ps, können Sie einfach Folgendes tun:

ps -C argv0

Wenn Sie verwenden möchten grep, ist dies völlig machbar, aber bei einer erneuten Suche nach argv0:

ps -eocomm= -opid=| grep ^argv0

... wodurch die Argumente jedes Befehls ausgeschlossen werden.

Und natürlich gibt es:

pgrep argv0
mikeserv
quelle