로그 파일을 정리하는 스크립트는 해당 파일을 삭제하지 않습니다.

로그 파일을 정리하는 스크립트는 해당 파일을 삭제하지 않습니다.

이 스크립트가 /var/logmessages 및 /var/log/wtmp 파일을 삭제하지 않는 이유를 누군가 설명해 줄 수 있습니까? tldp.org 튜토리얼에서 찾았습니다.

#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up"
exit

실행 후 /var/log 디렉토리를 확인했는데 "이전" 로그에 메시지와 wtmp가 여전히 남아 있었습니다.

왜 이런 일이 발생합니까?

답변1

반드시 로그 파일을 정리해야 하는 경우 sudo/root로 정리하고 syslog 데몬을 다시 시작해야 합니다. adm 그룹을 사용하면 로그 파일을 읽을 수만 있고 (일부) 쓸 수는 없습니다.

Unix 시스템에서 파일은 더 이상 사용되지 않거나 더 이상 존재하지 않는 경우에만 사용 중이던 공간을 포기하므로 ​​모든 로그 파티션을 사용한 파일을 삭제하려면 다음과 같이 syslog를 다시 시작해야 합니다. 공간이 확보되는 것을 보지 못했을 것입니다~까지syslog 데몬을 다시 시작합니다. 마찬가지로, syslog는 다시 시작할 때까지 stdout 리디렉션(">")을 사용하여 생성된 새 파일이 아닌 "삭제된" 파일에 로그를 계속 보냅니다.

wtmp 및 메시지와 관련하여 기본 권한을 살펴보겠습니다.

$ls -la /var/log/messages /var/log/wtmp
-rw-r----- 1 root adm 818148 Apr 14 07:15 /var/log/messages
-rw-rw-r-- 1 root utmp 284928 Apr 14 07:37 wtmp

따라서 스크립트는 다음과 같아야 합니다.

#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
sudo cat /dev/null > messages
sudo cat /dev/null > wtmp
sudo service rsyslogd restart
echo "Logs cleaned up"
exit 0

결국 syslog 데몬은 올바른 권한을 사용하여 /var/log/messages 파일도 (재)생성하므로 실제로는 다음과 같이 하는 것을 선호합니다.

#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
sudo rm messages
sudo sh -c 'cat /dev/null > wtmp'
sudo service rsyslogd restart
echo "Logs cleaned up"
exit 0

경고: 실행하는 스크립트에 주의하세요. 프로덕션 시스템에서는 /var/log/wtmp를 덮어쓰면 안 됩니다. 로그인한 사용자의 기록을 갖고 싶습니다.

관련 정보