我有一个正在运行的进程,需要在该进程运行期间从守护程序捕获日志。我有一个已经拼凑的解决方案,但是我希望有人可以指出一个稍微更优雅的方法。令我烦恼的是,因为我正在使用set -e
来提醒我任何问题,所以kill
会从tail
生成错误,我必须与|| :
一起吃,这对我来说是一个丑陋的hack。
#!/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" [email protected]
}
if [ -f $LOCKFILE ] ; then
echo "$(hostname) $(pwd) ${0} is locked $(ls -l ${LOCKFILE})"| mail -s "LOCKED: THING" [email protected]
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
最佳答案
我认为您所拥有的非常优雅。
作为解决方案,如何将set +e
放在kill之前,然后将set -e
放在kill之后?由于您期望尾部被杀死时的错误状态,所以不要寻找它。