Sürekli stdout'a yazılan bir programa sahip olanlar için, yapmanız gereken tek şey 'single match' seçeneğiyle aşındırmak. Grep eşleşen dizgiyi bulduktan sonra, grep'e aktarılan işlemdeki stdout'u kapatan çıkacaktır. Bu olay , işlem tekrar yazdığı sürece programın doğal olarak düzgün bir şekilde çıkmasına neden olmalıdır .
Olacak olan şey, grep çıktıktan sonra kapalı stdout'a yazmaya çalıştığında, işlem bir SİGPEPE alacak. İşte ping ile bir örnek, aksi takdirde süresiz çalışacak:
$ ping superuser.com | grep -m 1 "icmp_seq"
Bu komut ilk başarılı 'pong' ile eşleşecek ve daha sonra pingstdout'a yazmayı denediğinde bir dahaki seferden çıkacaktır .
Ancak,
Sürecin tekrar stdout'a yazacağı ve bu nedenle bir SIGPIPE'nin yükseltilmesine neden olamayacağı her zaman garanti edilemez (örneğin, bir günlük dosyasını tararken bu olabilir). Bu senaryo için bulabildiğim en iyi çözüm bir dosyaya yazmak; Lütfen geliştirebileceğinizi düşünüyorsanız yorum yapın:
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
Bunu yıkmak:
tail -f log_file & echo $! > pid- bir dosyayı yazar, işlemi arka plana ekler ve PID ( $!) dosyasını bir dosyaya kaydeder. PID'yi bir değişkene dışa aktarmayı denedim, ancak görünen o ki burada ve PID tekrar kullanıldığında bir yarış durumu var.
{ ... ;}- grup hep birlikte (tasarruf ve değişkenleri yeniden yardımcı olur zaman, ama o kısmı çalışma almak mümkün değildi) geçerli bağlamı tutarken çıktı grep boru can bu yüzden bu komutları
| - boru sol tarafının stdout'unu sağ tarafın stdinine
grep -m1 "find_me" - hedef dizgeyi bulun
&& kill -9 $(cat pid)- Force kill (SIGKILL) , eşleşen dizeyi bulduktan sonra çıktıktan sonrakitail süreç grep
&& rm pid - yarattığımız dosyayı kaldır
tail -fBir dosya çıktısının yanı sıra bir program çıktısının mümkün olduğunu düşünürdüm ... Yanlış mıyım?