2010-09-29 3 views
5

Ich habe ein paar Skripte, um einige Anwendungen (Start/Stopp/Liste/etc) zu steuern. Momentan sendet mein "stop" -Skript nur ein Interrupt-Signal an eine Anwendung, aber ich hätte gerne mehr Feedback darüber, welche Anwendung beim Herunterfahren funktioniert. Im Idealfall möchte ich sein Protokoll nachverfolgen, dann ein Interrupt-Signal senden und dann dieses Protokoll weiterverfolgen, bis die Anwendung beendet wird.Wie "tendiere diese Datei, bis dieser Prozess stoppt" in Bash?

Wie geht das mit einem Shell-Skript?

Antwort

10

Für nur eine Protokolldatei bis zu einem bestimmten Prozess Tailing stoppt (mit tail von GNU coreutils):

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

UPDATE Die oben eine Race-Bedingung enthält: do_something viele Zeilen Falls in logfile speist , die tail wird alle von ihnen überspringen, aber die letzten paar. Um zu vermeiden, dass und haben immer tail Druck die komplette Logfile, fügen Sie einen -n +1 Parameter auf den tail Anruf (das heißt auch POSIX tail(1)):

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

Cool, ich wusste nicht, der '--pid' Flagge! –

+0

Nun, z.B. POSIX 'tail' oder busybox' tail' haben nicht das '--pid' Flag, so dass Sie nicht darauf vertrauen können, dass es tatsächlich vorhanden ist. – ndim

+1

Ich sehe, aber GNU Coreutils ist "weit genug" genug für mich ;-) –

0

Hier ist ein Bash-Skript, das ohne --pid funktioniert. Ändern $log_file und $p_name Ihren Bedarf anpassen:

#!/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 !!" 
Verwandte Themen