Systemd

由 Systemd 執行時,無人值守升級不會使用 mailx

  • April 22, 2020

unattended-upgrades在執行 Raspbian ( Raspbian GNU/Linux 9.4 (stretch)) 的伺服器上進行了設置。無人值守升級版本:0.93.1+nmu1

更新有效,但我在電子郵件報告方面遇到問題。我想mailx用於發送報告。如果我使用命令執行更新,unattended-upgrade -v -d則會發送報告並使用我在/root/.mailrc.

但是,當unattended upgrades由 Systemd 計時器 ( apt-daily-upgrade.timer) 執行時,它不會使用mailx.

如果sendmail存在,則用於發送郵件。在這種情況下,郵件被發送,但發件人是root@hostname並且郵件被標記為垃圾郵件。

如果沒有,sendmail我會在以下日誌中看到此錯誤apt-daily-upgrade

Cannot start "/usr/sbin/sendmail": executable not found (adjust *sendmail* variable)

我不明白為什麼根據任務的啟動方式使用不同的郵件程序。

我試圖編輯unattended-upgradesPython 程序以強制它使用mailx

if os.path.exists(SENDMAIL_BINARY):
       ret = _send_mail_using_sendmail(from_email, to_email, subject, body)
   elif os.path.exists(MAIL_BINARY):
       ret = _send_mail_using_mailx(from_email, to_email, subject, body

我將變數更改SENDMAIL_BINARY為指向不存在的路徑,因此它將強制使用mailx. 這在unattended-upgrades手動呼叫時也有效,但在 Systemd 執行時失敗。(並且上面關於嘗試使用的錯誤sendmail仍然被記錄下來。)

即使由 systemd 自動執行,我如何強制unattended upgrades使用以及導致使用的郵件程序不同的原因是什麼?mailx

編輯:

執行無人值守升級的系統單元文件:

[Unit]
Description=Daily apt upgrade and clean activities
Documentation=man:apt(8)
ConditionACPower=true
After=apt-daily.service

[Service]
Type=oneshot
ExecStart=/usr/lib/apt/apt.systemd.daily install
KillMode=process
TimeoutStopSec=900

您的問題是常見問題解答的變體。為什麼在 systemd 下事情會有所不同?.

好處之一systemd是它提供了一致的執行環境。為了在安全性和簡單性方面出錯,環境變數集是最小的。

systemd執行環境的相關文件詳細說明了設置的內容。

您提到您的配置位於root主目錄中。man mailx確認它正在尋找~/.mailrc,而不是固定路徑/root/.mailrc

systemd文件闡明該變數$HOME僅在使用User=指令時設置。您沒有共享您的systemd服務文件,但我認為由於您以 root 身份執行任務,因此您沒有使用該User=指令。所以這可以解釋你的部分問題。

似乎您想要的路徑$PATH在執行時可能不是由您的環境變數設置的systemd。您可以通過將ExecStart=服務中的行替換為:

ExecStart=/bin/echo "My path is $PATH"

如果mailx路徑未列出,您可以使用Environment=指令顯式設置。

如果這個明確的提示不能解決您的問題,請務必查看上面連結的常見問題解答以獲得更多可能性。

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