logrotate 期間 gunzip 出錯
我正在使用 logrotate 來輪換我的網路伺服器上的 Symfony2 日誌。
一切正常,但我希望通過電子郵件將舊日誌發送給我。
所以,我在我的 logrotate conf 文件中添加了一些行,如下所示
日誌旋轉配置
/var/www/symfony/app/logs/prod.log { daily missingok rotate 5 compress notifempty mail myemail@example.com su www-data www-data }
現在我確實收到了電子郵件,但內容並不是我所期望的。
收到的電子郵件
/etc/cron.daily/logrotate:
錯誤:郵件命令失敗 /var/www/symfony/app/logs/prod.log.6.gz
錯誤:解壓縮命令失敗郵件 /var/www/symfony/app/logs/ prod.log.6.gz
執行部分:/etc/cron.daily/logrotate 退出並返回程式碼 1
我為這個錯誤做了很多研究,但我沒有發現任何有用的東西。我已經啟動了一個 strace,希望能對這個問題有所了解,但它沒有按預期工作。
跟踪命令
strace -f -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2
生成的文件很大,但我認為相關部分如下
跟踪輸出
第6842章
$$ “/usr/bin/mail”, “-s”, “/var/www/symfony/app/logs/prod.”…, “myemail@example.com” $$, [/* 18 vars */]
6841 <… setgid resumed> ) = 0
6842 <… execve resumed> ) = -1 ENOENT (沒有這樣的文件或目錄)
6841 setuid(0) = 0
6841 execve(" /bin/gunzip",$$ “/bin/gunzip” $$, [/* 18 個變數 */]
6842 exit_group(1) = ?
6841 <… execve resumed> ) = 0
6842 +++ exited with 1 +++
6841 brk(0
6840 <… wait4 resumed>$$ {WIFEXITED(s) && WEXITSTATUS(s) == 1} $$, 0, NULL) = 6842
6841 <… brk 恢復> ) = 0x85f010
6840 — SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=6842, si_uid=0, si_status=1, si_utime=0, si_stime= 0} —
6840 write(2, “error: “, 7
6841 access("/etc/ld.so.nohwcap”, F_OK
6840 <… write resumed> ) = 7
6841 <… access resumed> ) = -1 ENOENT (沒有這樣的文件或目錄)
6840 write(2, “mail command failed for /var/www”…, 65
如您所見,gunzip 命令以錯誤程式碼 1 和一些非常明確的問號 (?) 退出,以幫助我更好地了解正在發生的事情。我得到的唯一錯誤是“沒有這樣的文件或目錄”,我覺得這很奇怪,因為 logrotate 應該在發送電子郵件之前處理文件輪換。
我的問題,如何使用 gunzip/logrotate 解決這個問題,以便在刪除之前通過電子郵件接收旋轉的日誌文件?
以下是我的伺服器上可能與問題相關的一些資訊
root@someServer:/home/someUser# cat /etc/debian_version
8.1
root@someServer:/home/someUser# logrotate –version
logrotate 3.8.7
root@someServer:/home/someUser# gzip –version
gzip 1.6
此外,我的日誌文件非常小(~300-400 字節),如果我手動使用 gunzip,它就可以正常工作。
編輯 - 添加 logrotate 輸出
處理 1 個日誌
輪換模式:/var/www/symfony/app/logs/prod.log 從命令行強制(5 個輪換)
空日誌文件不輪換,舊日誌郵寄到 someEmail@example.com,將 euid
切換為 1000 和 egid
考慮到日誌 /var/www/symfony/app/logs/prod.log 日誌
需要旋轉
到33 全域模式'-
$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$'
將 /var/www/symfony/app/logs/prod.log.5.gz 重命名為 /var/www/symfony/app/logs/prod.log.6.gz (rotatecount 5, logstart 1, i 5),
將 /var/www/symfony/app/logs/prod.log.4.gz 重命名為 /var/www/symfony/app/logs/prod.log.5.gz (rotatecount 5, logstart 1, i 4),
重命名/var/www/symfony/app/logs/prod.log.3.gz 到 /var/www/symfony/app/logs/prod.log.4.gz (rotatecount 5, logstart 1, i 3),
重命名 / var/www/symfony/app/logs/prod.log.2.gz 到 /var/www/symfony/app/logs/prod.log.3.gz (rotatecount 5, logstart 1, i 2),
重命名 /var /www/symfony/app/logs/prod.log.1.gz 到 /var/www/symfony/app/logs/prod.log.2.gz (rotatecount 5, logstart 1, i 1),
重命名 /var/ www/symfony/app/logs/prod.log.0.gz 到 /var/www/symfony/app/logs/prod.log.1.gz (rotatecount 5, logstart 1, i 0),
舊日誌 /var/www/symfony/app/logs/prod.log.0.gz 不存在
將 /var/www/symfony/app/logs/prod.log 重命名為 /var/www/symfony/app/logs/ prod.log.1
壓縮日誌:/bin/gzip
切換 uid 到 1000 和 gid 到 33
切換 uid 到 1000 和 gid 到 33
切換 euid 到 0 和 egid 到 0
錯誤:郵件命令失敗 /var/www/symfony/ app/logs/prod.log.6.gz
錯誤:解壓縮命令失敗郵件 /var/www/symfony/app/logs/prod.log.6.gz
將 euid 切換為 0 並將 egid 切換為 0
下面是完整的strace:
strace -vf -s 128 -e verbose=all -o ./strace.txt logrotate -d /etc/logrotate.d/symfony2
根據您的 strace,您的問題實際上不是 gzip。
這就是 gzip 失敗的原因。
14972 write(1, "<Here is the content of my prod.log file>"..., 32768) = -1 EPIPE (Broken pipe)
該過程正在寫入標準輸出,但實際輸出是郵件命令的輸入。如果我們檢查這個:
14973 execve("/usr/bin/mail", ["/usr/bin/mail", "-s", "/var/www/symfony/app/logs/prod.log", "someUser@example.com"], ["SHELL=/bin/bash", "TERM=xterm", "USER=root", "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41"..., "SUDO_USER=none", "SUDO_UID=1000", "USERNAME=root", "MAIL=/var/mail/root", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "PWD=/home/none", "LANG=en_GB.UTF-8", "SHLVL=1", "SUDO_COMMAND=/bin/bash", "HOME=/root", "LANGUAGE=en_GB:en", "LOGNAME=root", "SUDO_GID=1000", "_=/usr/bin/strace"] <unfinished ...> 14973 <... execve resumed> ) = -1 ENOENT (No such file or directory)
當您嘗試執行 mail 命令時,它會因為
/usr/bin/mail
不存在而失敗。程序退出,當管道的另一端消失stdout
時gzip
返回。SIGPIPE
因此 gzip 以 1 退出。你需要做的是安裝一個
bsd-mailx
在 debianesque 系統或mailx
基於 Redhat 的系統上。