开发者

How to do "tail this file until that process stops" in Bash?

开发者 https://www.devze.com 2023-01-17 20:52 出处:网络
I have a couple of scripts to control some applications (start/stop/list/etc). Currently my \"stop\" script just sends an interrupt signal to an application, but I\'d like to have more feedback about

I have a couple of scripts to control some applications (start/stop/list/etc). Currently my "stop" script just sends an interrupt signal to an application, but I'd like to have more feedback about what application does when it is shutting down. Ideally, I'd like to start tailing its log, then sen开发者_StackOverflow社区d an interrupt signal and then keep tailing that log until the application stops.

How to do this with a shell script?


For just tailing a log file until a certain process stops (using tail from GNU coreutils):

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

UPDATE The above contains a race condition: In case do_something spews many lines into logfile, the tail will skip all of them but the last few. To avoid that and always have tail print the complete logfile, add a -n +1 parameter to the tail call (that is even POSIX tail(1)):

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


Here's a Bash script that works without --pid. Change $log_file and $p_name to suit your need:

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


If you need to tail log until process exited, but watch stdout / sdterr at the same time, try this:

# Run some process in bg (background):
some_process & 
# Get process id:
pid=$!
# Tail the log once it is created, but watch process stdout/stderr at the same time:
tail --pid=$pid -f --retry log_file_path & 
# Since tail is running in bg also - wait until the process has completed:
tail --pid=$pid -f /dev/null  
0

精彩评论

暂无评论...
验证码 换一张
取 消