목적
그래서 로그가 특정 크기에 도달하면 로그를 기록하고 회전시키는 스크립트를 작성했습니다.의도적으로 로그에 반영한 오류와 다른 명령의 출력을 모두 캡처하고 싶습니다.
이를 달성한 방법은 STDIN 및 STDOUT을 tee
프로세스 교체로 리디렉션하고 savelog
로그를 회전하는 작은 함수를 작성하는 것이었습니다.
#!/bin/bash
LOGFILE="/var/log/ps.log"
exec > >(tee "$LOGFILE") 2>&1
LOGPATH="/var/log"
MAX_LOGFILE_SIZE=5
rotateLog() {
currentsize=$(du -k $LOGFILE | cut -f1)
if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
savelog -dn $LOGFILE &>/dev/null
fi
}
while :; do
echo "A computer program can easily produce gibberish - especially if it has been provided with garbage beforehand. This program does something a little different. It takes a block of text as input and works out the proportion of characters within the text according to a chosen order. For example, an order of 2 means the program looks at pairs of letters, an order of 3 means triplets of letters and so on. The software can regurgitate random text that is controlled by the proportion of characters. The results can be quite surprising."
rotateLog
sleep 5
done
질문
문제는 ps.log
로그가 교체된 후에도 ps.log.20180829131658
모든 로그가 계속 기록 ps.log.20180829131658
되고 다음 오류가 발생한다는 것입니다.
du: '/var/log/ps.log'에 액세스할 수 없습니다. 해당 파일이나 디렉터리가 없습니다./ps.sh: 12행: [: -ge: 단항 연산자가 필요합니다.
결과적으로 로그가 더 이상 순환되지 않습니다!
가설
ps.log
일단 회전 되면 ps.log.20180829131658
새 로그 파일이 생성된다고 가정합니다 . 그러나 단 한 번만 실행되기 ps.log
때문에 반드시 그런 것은 아닙니다 (exec
여기서 정확히 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있나요?) 즉, 스크립트 시작 부분에 있습니다.
관찰하다
>(tee "$LOGFILE")
/var/log/p.log
또한 해당 지점 에 대해 새 파일 설명자가 생성되어 p.log.20180829131658
! 이는 분명히 로그가 계속 기록되는 결과를 낳습니다 p.log.20180829131658
.누구든지 이 동작을 설명할 수 있나요?
root@b537ccc2c1ab:/var/log# ls -lrt
-rw-r--r-- 1 root root 7248 Aug 29 13:16 ps.log
root@b537ccc2c1ab:/var/log# ls -lrt /proc/*/fd
/proc/8979/fd:
total 0
l-wx------ 1 root root 64 Aug 29 13:16 3 -> /var/log/ps.log
lrwx------ 1 root root 64 Aug 29 13:16 2 -> /dev/pts/17
lrwx------ 1 root root 64 Aug 29 13:16 1 -> /dev/pts/17
lr-x------ 1 root root 64 Aug 29 13:16 0 -> pipe:[3889791]
root@b537ccc2c1ab:/var/log# ls -lrt
-rw-r--r-- 1 root root 11098 Aug 29 13:17 ps.log.20180829131658
root@b537ccc2c1ab:/var/log# ls -lrt /proc/*/fd
/proc/8979/fd:
total 0
l-wx------ 1 root root 64 Aug 29 13:16 3 -> /var/log/ps.log.20180829131658
lrwx------ 1 root root 64 Aug 29 13:16 2 -> /dev/pts/17
lrwx------ 1 root root 64 Aug 29 13:16 1 -> /dev/pts/17
lr-x------ 1 root root 64 Aug 29 13:16 0 -> pipe:[3889791]
이 로깅 및 로그 순환 구성표를 사용하여 어떻게 목표를 달성할 수 있습니까? 특히, 로그 회전 외에도 스크립트의 다른 모든 명령에서 오류와 출력을 캡처하면서 내 스크립트가 최신 로그 파일에 쓸 수 있는 방법은 무엇입니까?
답변1
프로세스에 의해 파일이 열리면 이름 바꾸기, 자르기, 삭제 등 파일에 대한 다양한 작업을 수행할 수 있지만 프로세스에서는 여전히 파일이 열려 있습니다. 일반적인 실수는 로그 파일이 모든 디스크 공간을 사용하면 사람들이 공간을 확보하기 위해 파일을 삭제한다는 것입니다. 그러나 로그 파일에 쓰는 프로세스는 여전히 열려 있으므로 공간이 해제되지 않습니다. 파일에 할당된 블록은 프로세스가 파일을 닫을 때만 해제됩니다. (여기서 해결 방법은 파일을 자르는 것입니다. 즉 > logfile
, .)
귀하의 경우 파일 이름을 바꾸었지만 파일을 작성하는 프로세스는 이에 대해 알지 못하거나 신경 쓰지 않습니다.
유틸리티 에는 이러한 경우에 대한 옵션이 logcheck
있습니다 copytruncate
. 즉, 로그 파일을 교체된 이름으로 복사한 다음 원본 로그 파일을 자릅니다. 당신도 같은 일을 할 수 있습니다:
rotateLog() {
currentsize=$(du -k $LOGFILE | cut -f1)
if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
ROTATEDLOG=$LOGFILE.$(date +%Y%m%d%H%M%S)
cp -p $LOGFILE $ROTATEDLOG && true > $LOGFILE
fi
}
더 나은 대안은 로그 파일 닫기 및 다시 열기와 같은 SIGHUP 신호를 이해하도록 프로세스를 수정하는 것입니다. trap
이 문제를 처리하려면 셸 명령을 참조하세요 .
답변2
@wurtel이 제안한 대체 솔루션을 기반으로 다음과 같이 작동하도록 했습니다.
#!/bin/bash
LOGFILE="/root/logr/simple.log"
function sighuphandler() {
exec > >(tee "$LOGFILE") 2>&1
}
trap sighuphandler SIGHUP
LOGPATH="/root/logr"
MAX_LOGFILE_SIZE=5
rotateLog() {
currentsize=$(du -k $LOGFILE | cut -f1)
if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
savelog -dn $LOGFILE &>/dev/null
kill -s SIGHUP $$
fi
}
sighuphandler
while :; do
echo "[`date "+%Y-%m-%d %H:%M:%S"`] [INFO] - A computer program can easily produce gibberish - especially if it has been provided with garbage beforehand. This program does something a little different. It takes a block of text as input and works out the proportion of characters within the text according to a chosen order. For example, an order of 2 means the program looks at pairs of letters, an order of 3 means triplets of letters and so on. The software can regurgitate random text that is controlled by the proportion of characters. The results can be quite surprising."
ls +
rotateLog
sleep 5
done