Arch-Linux

oneshot systemd單元和root命令行之間的區別?

  • July 29, 2020

我的設置包括一個通過 exim 命令行向本地使用者發送郵件的腳本。這個腳本被稱為 root (現實當然更複雜,但這似乎是一個最小的工作範例)。

/home/jens/send_mail:
#!/bin/sh
cat /home/jens/testmail | /usr/bin/exim -bm jens

從根 shell 執行此腳本可以正常工作。郵件傳遞沒有問題。

現在我嘗試自動化這個腳本並從 systemd 服務呼叫它:

/etc/systemd/system/send_mail.service:
[Unit]
Description=Send mail to jens

[Service]
Type=oneshot
ExecStart=/home/jens/send_mail

[Install]
WantedBy=multi-user.target

執行systemctl start send_mail.service不會投遞郵件,而是將其放在 exim 隊列中以便稍後投遞。在我的真實設置中,我發現行閱讀

... exim[275968]: 2020-07-16 23:09:40 1jwB8O-0019n4-Lj failed to write to main log: length=91 result=-1 errno=9 (Bad file descriptor)
... exim[275968]: write failed on panic log: length=116 result=-1 errno=9 (Bad file descriptor)

在我的日記中。據我所知,我的根 shell 沒有特定於 exim 的環境變數。這種不同行為的原因可能是什麼?

我在 Arch Linux 上使用 exim 4.94。請詢問您是否需要更多詳細資訊。

這個問題似乎是由 systemd 在send_mail完成執行後立即終止生成的 exim 程序引起的。

它可以通過在結束時等待適當的時間來解決,或者將 systemd 單元中send_mail的選項設置為or (手冊建議不要這樣做)。KillMode``process``none

資料來源:

  1. https://systemd-devel.freedesktop.narkive.com/nV1QMO8j/exim4-only-queues-mails-sent-by-systemd-service
  2. https://www.freedesktop.org/software/systemd/man/systemd.kill.html

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