2010-09-29 8 views
5

Mam kilka skryptów do kontrolowania niektórych aplikacji (start/stop/list/etc). Obecnie mój skrypt "stop" po prostu wysyła sygnał przerwania do aplikacji, ale chciałbym uzyskać więcej informacji zwrotnych na temat tego, co robi aplikacja, gdy jest ona zamykana. Idealnie, chciałbym rozpocząć śledzenie jego dziennika, a następnie wysłać sygnał przerwania, a następnie śledzić ten dziennik aż do zatrzymania aplikacji.Jak zrobić "ogonić ten plik, aż ten proces się zatrzyma" w Bash?

Jak to zrobić ze skryptem powłoki?

Odpowiedz

10

Dla właśnie końca pliku dziennika aż pewnego procesu zatrzymuje się (za pomocą tail z Coreutils GNU):

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

UPDATE Powyższy zawiera warunek Rasa: W przypadku do_something wypluwa wiele linii w logfile , tail pominie wszystkie, ale kilka ostatnich. Aby tego uniknąć i zawsze mają tail drukiem pełna logfile, dodać parametr -n +1 na wezwanie tail (czyli nawet POSIX tail(1)):

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

Cool, nie wiedziałem o '--pid' flagą! –

+0

Cóż, np. POSIX 'tail' lub busybox' tail' nie mają flagi '--pid', więc nie można polegać na tym, że faktycznie jest obecna. – ndim

+1

Rozumiem, ale GNU coreutils jest "wystarczająco" dla mnie wystarczające ;-) –

0

Oto skrypt bash, który działa bez --pid. Zmień $log_file i $p_name do własnych potrzeb:

#!/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 !!" 
Powiązane problemy