2014-10-14 4 views
3

프로세스가 실행되는 동안 데몬에서 로그를 캡처해야하는 프로세스가 있습니다. 나는 함께 자갈을 만든 해결책이 있지만 누군가가 나를 좀 더 우아한 방법으로 가리켜 주길 바랬다. 나를 괴롭히는 구체적인 것은 set -e을 사용하여 어떤 문제라도 알려주므로 kill은에서 오류를 생성합니다. 나는 || :으로 먹어야하는데, 저에게 추한 해킹입니다.실시간으로 발췌 부분에 로그를 작성하십시오.

#!/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 
+1

제 의견으로는 당신이 가지고있는 것은 꽤 우아합니다. 해결책으로, 죽이기 직전에'set + e'를 넣고,'set -e'를 뒤에 넣는 것은 어떻습니까? 꼬리가 죽을 때의 오류 상태가 예상되므로이를 찾지 마십시오. –

+0

그건 .. 사실 그렇게 생각 했어야 했어. 이 대답을하면 받아 들일 것입니다. 감사. – DopeGhoti

+0

여분의 눈은 항상 도움이됩니다! :-) –

답변

2

제 의견으로는 당신이 가지고있는 것은 꽤 우아합니다.

해결책으로, 살인 직전에 set +e을 넣고, 후에 set -e을 넣는 것은 어떻습니까? 꼬리가 죽을 때의 오류 상태가 예상되므로이를 찾지 마십시오.