Command-Line
清理舊日誌文件的命令
我試圖通過 Cron Jobs 自動清理我的 Ubuntu 系統
我試圖簡化這一點:
sudo find /var/log -type f -name "*.1.gz" -delete sudo find /var/log -type f -name "*.2.gz" -delete sudo find /var/log -type f -name "*.3.gz" -delete sudo find /var/log -type f -name "*.4.gz" -delete ,etc...
像下面這樣的一個命令但不起作用,可能是因為我不知道……
for i=[^0-9]; sudo find /var/log -type f -name "*.$i.gz"
我嘗試了類似的,但也沒有奏效……:
$i=[^0-9]; sudo find /var/log -type f -name "*.$i.gz" i=[^0-9]; sudo find /var/log -type f -name "*.$i.gz" i=[^0-9]+$; sudo find /var/log -type f -name "*.$i.gz"
最後四個我看不到任何輸出……並且有人產生錯誤……
那麼正確的命令/語法是什麼?
還有任何其他想法可以讓我的“迷你”伺服器保持清潔嗎?
其他問題:如果我執行
sudo find / -type f -name "*.7.gz"
會出現這個:
“/usr/share/doc/libruby1.9.1/NEWS-1.8.7.gz”
我可以解決這個問題:
如果我跑:
sudo find / -type f -name "*log.7.gz"
但我可能會跳過那些有
*error.(0-9).gz
副檔名的人和許多其他人……**任何在/**下清理舊日誌的想法,而無需像這些那樣查找/刪除:“/usr/share/doc/libruby1.9.1/NEWS-1.8.7.gz”
編輯
在我的 /etc/logrotate.d 中是:
/var/log/apache2/*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate if /etc/init.d/apache2 status > /dev/null ; then \ /etc/init.d/apache2 reload > /dev/null; \ fi; endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript } /var/log/apport.log { daily rotate 7 delaycompress compress notifempty missingok } /var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty } /var/log/aptitude { rotate 6 monthly compress missingok notifempty } /var/log/cups/*log { daily missingok rotate 7 sharedscripts prerotate if [ -e /var/run/cups/cupsd.pid ]; then invoke-rc.d --quiet cups stop > /dev/null touch /var/run/cups/cupsd.stopped fi endscript postrotate if [ -e /var/run/cups/cupsd.stopped ]; then rm /var/run/cups/cupsd.stopped invoke-rc.d --quiet cups start > /dev/null sleep 10 fi endscript compress notifempty create } /var/log/dpkg.log { monthly rotate 12 compress delaycompress missingok notifempty create 644 root root } /var/log/alternatives.log { monthly rotate 12 compress delaycompress missingok notifempty create 644 root root } # - I put everything in one block and added sharedscripts, so that mysql gets # flush-logs'd only once. # Else the binary logs would automatically increase by n times every day. /var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/error.log { daily rotate 7 missingok create 640 mysql adm compress sharedscripts postrotate test -x /usr/bin/mysqladmin || exit 0 # If this fails, check debian.conf! MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf" if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then # Really no mysqld or rather a missing debian-sys-maint user? # If this occurs and is not a error please report a bug. #if ps cax | grep -q mysqld; then if killall -q -s0 -umysql mysqld; then exit 1 fi else $MYADMIN flush-logs fi endscript } /var/log/pm-suspend.log /var/log/pm-powersave.log { monthly rotate 4 delaycompress compress notifempty missingok } /var/log/ppp-connect-errors { weekly rotate 4 missingok notifempty compress nocreate } /var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate reload rsyslog >/dev/null 2>&1 || true endscript } /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate reload rsyslog >/dev/null 2>&1 || true endscript } /var/log/speech-dispatcher/speech-dispatcher.log /var/log/speech-dispatcher/speech-dispatcher-protocol.log { daily compress missingok sharedscripts rotate 7 postrotate /etc/init.d/speech-dispatcher reload >/dev/null endscript } /var/log/speech-dispatcher/debug-epos-generic /var/log/speech-dispatcher/debug-festival /var/log/speech-dispatcher/debug-flite { daily compress missingok sharedscripts rotate 2 postrotate /etc/init.d/speech-dispatcher reload >/dev/null endscript } /var/log/ufw.log { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog reload >/dev/null 2>&1 || true endscript } /var/log/unattended-upgrades/unattended-upgrades.log /var/log/unattended-upgrades/unattended-upgrades-shutdown.log { rotate 6 monthly compress missingok notifempty } /var/log/upstart/*.log { daily missingok rotate 7 compress notifempty nocreate } /var/log/vsftpd.log { create 640 root adm # ftpd doesn't handle SIGHUP properly missingok notifempty rotate 4 weekly }
在 /etc/logrotate.conf 中:
# see "man logrotate" for details # rotate log files weekly weekly # use the syslog group by default, since this is the owning group # of /var/log/syslog. su root syslog # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we'll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 } # system-specific logs may be configured here
每個範例我可以設置 100k 輪換 3 個所有日誌嗎?如何?並且該配置至少可以保留多少日誌?
這裡不需要使用 for 循環,你可以使用
find
:sudo find /var/log/ -type f -regex '.*\.[0-9]+\.gz$' -delete
但是,正如建議的那樣,請查看手冊頁以
logrotate
了解減少文件數量的方法。