Für diejenigen, die ein Programm haben, das kontinuierlich nach stdout schreibt, ist alles, was Sie tun müssen, es an grep mit der Option 'single match' weiterzuleiten. Sobald grep die passende Zeichenfolge gefunden hat, wird es beendet, wodurch stdout für den Prozess geschlossen wird, der an grep weitergeleitet wird. Dieses Ereignis sollte natürlich dazu führen, dass das Programm ordnungsgemäß beendet wird , solange der Prozess erneut schreibt .
Was passieren wird, ist, dass der Prozess ein SIGPIPE erhält, wenn er versucht, nach dem Beenden von grep auf closed stdout zu schreiben. Hier ist ein Beispiel mit Ping, das andernfalls auf unbestimmte Zeit ausgeführt würde:
$ ping superuser.com | grep -m 1 "icmp_seq"
Dieser Befehl stimmt mit dem ersten erfolgreichen 'pong' überein und wird dann beendet, wenn das nächste Mal ping
versucht wird, nach stdout zu schreiben.
Jedoch,
Es ist nicht immer garantiert, dass der Prozess wieder auf stdout schreibt und daher möglicherweise kein SIGPIPE ausgelöst wird (dies kann z. B. beim Verfolgen einer Protokolldatei passieren). Die beste Lösung für dieses Szenario ist das Schreiben in eine Datei. Bitte kommentieren Sie, wenn Sie glauben, dass Sie sich verbessern können:
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
Aufschlüsselung:
tail -f log_file & echo $! > pid
- legt eine Datei an, hängt den Prozess an den Hintergrund an und speichert die PID ( $!
) in einer Datei. Ich habe versucht, die PID stattdessen in eine Variable zu exportieren, aber es scheint, als gäbe es eine Wettlaufsituation zwischen hier und dem Zeitpunkt, an dem die PID erneut verwendet wird.
{ ... ;}
- Gruppieren Sie diese Befehle, damit wir die Ausgabe an grep leiten können, während der aktuelle Kontext beibehalten wird. (Hilft beim Speichern und Wiederverwenden von Variablen, konnte diesen Teil jedoch nicht zum Laufen bringen.)
|
- Leiten Sie den Abstand der linken Seite zum Abstand der rechten Seite
grep -m1 "find_me"
- Finden Sie die Zielzeichenfolge
&& kill -9 $(cat pid)
- Erzwinge das Beenden (SIGKILL) des tail
Prozesses nach dem grep
Beenden, sobald der passende String gefunden wurde
&& rm pid
- Entfernen Sie die von uns erstellte Datei
tail -f
ein Programm genauso wie eine Datei auszugeben ... irre ich mich?