2010-09-29 10 views
5

Bazı uygulamaları (başlangıç ​​/ durdur/liste/etc) kontrol etmek için birkaç komut dosyası var. Şu anda benim "dur" komutum sadece bir uygulama için bir kesme sinyali gönderir, ama ne zaman kapatıyor ne uygulama hakkında daha fazla geri bildirim almak istiyorum. İdeal olarak, günlüğünü takip etmeye başlamak, sonra bir kesme sinyali göndermek ve daha sonra uygulama duruncaya kadar o günlüğü takip etmek istiyorum.Bash’te "bu işlem duruncaya kadar bu dosyayı kuyruğa sokma" nasıl yapılır?

Bunu bir kabuk komut dosyasıyla nasıl yapabilirim? durumda do_something yılında logfile içine kadar satır spews: Yukarıdaki bir yarış koşulu içeren

do_something > logfile & 
tail --pid $! -f logfile 

GÜNCELLEME: Sadece belli bir süreç kadar bir günlük dosyasında atık için

cevap

10

(tailitibaren GNU coreutils kullanarak) durur tail, hepsini değil, son bir kaçını atlayacak. (Bile POSIX tail(1) olduğunu) önlemek ve her zaman, tail baskı komple günlük dosyası var tail çağrısına bir -n +1 parametre eklemek için:

do_something > logfile & 
tail --pid $! -n +1 -f logfile 
+0

Serin ben '--pid' bayrağının bilmiyordum: ihtiyaca uygun $log_file ve $p_name değiştirin! –

+0

Eh, ör. POSIX 'tail' veya busybox' kuyruk ''pid' bayrağı yok, bu yüzden aslında mevcut olana güvenemezsiniz. – ndim

+1

Görüyorum, ama GNU coreutils benim için "yaygın" dır ;-) –

0

İşte --pid olmadan çalışan bir Bash senaryo. ,

#!/bin/bash 

log_file="/var/log/messages" 
p_name="firefox" 

tail -n10 $log_file 
curr_line="$(tail -n1 $log_file)" 
last_line="$(tail -n1 $log_file)" 

while [ $(ps aux | grep $p_name | grep -v grep | wc -l) -gt 0 ] 
do 
     curr_line="$(tail -n1 $log_file)" 
     if [ "$curr_line" != "$last_line" ] 
     then 
       echo $curr_line 
       last_line=$curr_line 
     fi 
done 
echo "[*] $p_name exited !!" 
İlgili konular