Debian

logrotate 期間 gunzip 出錯

  • January 19, 2016

我正在使用 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

http://pastebin.com/C0uj0419

根據您的 strace,您的問題實際上不是 gzip。

這就是 gzip 失敗的原因。

14972 write(1, "&lt;Here is the content of my prod.log file&gt;"..., 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"] &lt;unfinished ...&gt;
14973 &lt;... execve resumed&gt; )            = -1 ENOENT (No such file or directory)

當您嘗試執行 mail 命令時,它會因為/usr/bin/mail不存在而失敗。程序退出,當管道的另一端消失stdoutgzip返回。SIGPIPE因此 gzip 以 1 退出。

你需要做的是安裝一個mail命令。那可能是bsd-mailx在 debianesque 系統或mailx基於 Redhat 的系統上。

引用自:https://serverfault.com/questions/749350