Bazı komutların çalışması sırasında günlükleri bir işlemden okuma


10

Dosya günlükleri üreten bazı hizmet var logs.log.

Bu hizmetle etkileşime giren başka bir komut var. Diyelim ki biraz foo.sh.

İhtiyacım olan şey, çalışma logs.logsırasında günlükleri kesmek ve kaydetmek foo.sh. Başka bir deyişle, benim ile etkileşime girdiğinde hizmet günlüklerinin bu kısmına ihtiyacım var foo.sh(bu yüzden foo.shgünlüklerini umursamıyorum ).

Bu komutun hile yapmasını beklerdim, ama foo.shzaten bittiğinde dosyayı okumaya devam eder :

> foo.sh | tail -f logs.log > foo_part.log

Bu numarayı yapmanın güzel bir yolu var mı?

Yanıtlar:


12

Bu, arka plan işlemlerinizi arka plana göndererek oldukça basittir:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!yakalar son işin PID biz böyle en arka planda çalışmasına gönderilen waitsonra bitirmek için senaryo üzerinde ve artık ihtiyacınız olduğunda süreci.killtail


3
harika cevap, bugün yeni bir şey öğrendim
Miguel Mota

7

Bu sürüm de yapabilir (sanırım):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

% 1 öğesinin alt kabuktaki ilk arka plan işlemine çarpacağını unutmayın


Şahsen, iş listesini kullanmak yerine açık PID'leri yakalamayı tercih ediyorum, çünkü bunun giderek karmaşık bir uygulaması arka planda birden fazla görevi yerine kill %1getirebilir ve yanlış hedef alabilir.
DopeGhoti

1
Çünkü% 1 subshell içindeki ilk işe atıfta bulunacak şekilde subshell parantezlerini kullandığımdan (ancak tüm kabuklar için bu konuda emin değilim). Açıkçası çözüm daha eksiksiz ve daha fazla durum için fonksiyonel, ama ben kullanıcının ihtiyaç ne yapabilirim düşünüyorum .... Başka bir sorun benim sürüm en az dokunuşla foo_part.log oluşturulması gerekir, sürüm yok.
Luciano Andress Martini
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.