实时记录日志

时间:2014-10-14 21:13:01

标签: linux bash wait kill tail

我有一个正在运行的进程,我需要在进程运行期间从守护进程捕获日志。我有一个我拼凑在一起的解决方案,但我希望有人可以用更优雅的方式指出我这样做。我感到特别恼火的是,因为我使用set -e提醒我任何问题,kill会从tail生成错误,我必须和|| :一起吃,对我来说这是一个丑陋的黑客。

#!/bin/bash
set -e
LOGDIR="/path/to/logs"
LOCKFILE="/path/to/lockfile"
NOW=$( date +'%Y-%m-%d-%H%M' )

bail() {
   echo "$(hostname) $(pwd) error in line $1 of THING" | mail -s "Error: THING on $(hostname) line# $1" me@example.com
}

if [ -f $LOCKFILE ] ; then
   echo "$(hostname) $(pwd) ${0} is locked $(ls -l ${LOCKFILE})"| mail -s "LOCKED: THING" me@example.com
   exit
else
   trap "rm -f $LOCKFILE" EXIT
   trap 'bail $LINENO' ERR
fi

echo $$ > $LOCKFILE
/bin/date >> $LOCKFILE

tail -f path/to/daemon/logfile > $LOGDIR/${NOW}-THING.log &
TAILPID=$!

sleep 1
/path/to/monitored-process
sleep 1 # Allow for last couple log entries to flush
kill $TAILPID
wait $TAILPID || : # Need the no-op to eat the expected error from `kill`ing tail

/bin/rm -f $LOCKFILE

1 个答案:

答案 0 :(得分:2)

在我看来,你所拥有的是非常优雅的。

作为一个解决方案,如何在杀戮之前放置set +e,之后放置set -e?由于你在尾巴被杀时期待错误状态,所以不要寻找它。