ログファイルをクリーンアップするスクリプトはそのファイルを削除しません。

ログファイルをクリーンアップするスクリプトはそのファイルを削除しません。

このスクリプトが/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 を上書きしないでください。ログインしたユーザーの履歴が欲しいです。

おすすめ記事