oneshot systemd 单元和 root 命令行之间的区别?

oneshot systemd 单元和 root 命令行之间的区别?

我的设置包括一个通过 exim 命令行向本地用户发送邮件的脚本。该脚本被称为 root(现实当然更复杂,但这似乎是一个最小的工作示例)。

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

从 root 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)

在我的日记中。据我所知,我的 root shell 没有特定于 exim 的环境变量。这种不同行为的原因可能是什么?

我在 Arch Linux 上使用 exim 4.94。请询问您是否需要更多详细信息。

答案1

send_mail此问题似乎是由于 systemd 在执行完毕后立即终止生成的 exim 进程而导致的。

可以通过在 结束时等待适当的时间send_mail,或者将KillModesystemd 单元中的选项设置为processnone(手册建议不要这样做)来解决。

资料来源:

  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

相关内容