Command-Line

清理舊日誌文件的命令

  • June 26, 2017

我試圖通過 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了解減少文件數量的方法。

引用自:https://unix.stackexchange.com/questions/184488