2010-09-29 14 views
5

Tengo un par de scripts para controlar algunas aplicaciones (inicio/parada/lista/etc). Actualmente mi script de "detención" solo envía una señal de interrupción a una aplicación, pero me gustaría recibir más comentarios sobre lo que hace la aplicación cuando se apaga. Idealmente, me gustaría comenzar a seguir su registro, luego enviar una señal de interrupción y seguir rastreando ese registro hasta que se detenga la aplicación.¿Cómo hacer "cola este archivo hasta que el proceso se detenga" en Bash?

¿Cómo hacer esto con un script de shell?

Respuesta

10

Por solo tizón de un archivo de registro hasta un cierto proceso se detiene (usando tail de coreutils GNU):

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

ACTUALIZACIÓN El anterior contiene una condición de carrera: En caso do_something SPEWS muchas líneas en logfile , el tail se salteará todos menos los últimos. Para evitar eso y siempre tienen tail el archivo de registro de impresión completa, agregar un parámetro -n +1 a la llamada tail (que es incluso POSIX tail(1)):

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

fresca, que no sabía de la bandera '--pid'! –

+0

Bueno, p. POSIX 'tail' o busybox' tail' no tienen el indicador '--pid', por lo que no puede confiar en que realmente esté presente. – ndim

+1

Ya veo, pero GNU coreutils es "ampliamente" suficiente para mí ;-) –

0

Aquí es un script bash que funciona sin --pid. Cambiar $log_file y $p_name para adaptarse a su necesidad:

#!/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 !!" 
Cuestiones relacionadas