首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/usr/bin/ ExecStart中的邮件呼叫不发送任何邮件

/usr/bin/ ExecStart中的邮件呼叫不发送任何邮件
EN

Unix & Linux用户
提问于 2015-09-22 02:04:14
回答 2查看 3.5K关注 0票数 5

我配置了以下服务:

代码语言:javascript
复制
[Unit]
Description=SCollector
After=NetworkManager.service

[Service]  
Type=simple
ExecStart=/bin/sh -c "/opt/scollector/scollector /opt/scollector/collectors || (echo '' | /usr/bin/mail -s 'scollector died' jharvey@stackoverflow.com && exit -1)"
Restart=on-failure

[Install]
WantedBy=multi-user.target    

由于某种原因,当mail进程以非-0形式退出时,scollector命令从不发送任何邮件。这可以在命令行、/bin/sh调用和所有程序上运行。我捕获了mail的STDOUT和STDERR,它没有抛出任何错误。在maillog中什么都没有。

怎么回事?为什么它不发邮件?

EN

回答 2

Unix & Linux用户

发布于 2015-09-22 02:04:14

/usr/bin/mail执行双fork来守护发送电子邮件的sendmail。这个sendmail proc被重新拥有给init,因此通常它不会受到与原始父服务器发生的任何事情的影响--除非在systemd情况下,再生孙辈仍然与原始服务位于同一个cgroup中。当systemd分解时,它会杀死cgroup中的所有进程,包括重新拥有的sendmail进程。

mail命令本身运行良好,但sendmail在有机会完成任务之前就被systemd杀死了。

您可以通过将KillMode设置为Unit节中的process (默认为control-group)来解决这一问题。这将导致systemd只杀死它直接触发的进程。

有趣的是,我偶然发现这是通过使用strace。一个普通的strace没有透露任何信息,但是mail在使用strace -f时突然开始工作。strace -f导致了这个主要过程的继续存在,直到所有的孩子和孤儿的孙辈都结束了。

票数 7
EN

Unix & Linux用户

发布于 2015-10-04 12:30:27

发问者已经发现了问题;但是xyr解决方案是一个错误,而xyr对力学的描述是不正确的。

mail命令不执行双叉。它只分叉一次,sendmail进程是它的直接子进程,没有对任何东西进行修复。它只需在退出之前选择是否为该子waitpid()

sendmail本身也是如此。它不是双叉的。在某些MTSes上,它甚至根本不分叉。在其他情况下,它只分叉一次,并选择是否等待取决于某个可配置的“传递模式”选项。

解决这个问题的正确方法有两方面:

  1. 设置mailx的S文档化和标准化的sendwait选项。这具体解决了异步排队的问题,让mailx等待sendmail子进程完成。(遗憾的是,尽管这个选项至少从1986年开始就已经出现,并且在SVID中为mailx记录在案,但bsd-mailx没有。传家宝-邮件有它。)
  2. 如果MTS尚未使用,则设置使用同步排队/传递模式的MTS。
    • 如果使用netqmail,什么都不做。netqmail的sendmail总是排队和同步的,通过qmail-inject直接链式加载到qmail-queue,根本没有分叉。
    • 如果使用后缀,什么也不做。Postfix的sendmail总是排队并同步,分叉一次,等待postdrop完成,然后退出。
    • exim有-odf命令行选项。

再读

  • 实用程序: mailx: mailx中的内部变量。外壳和实用程序。单一UNIX规范。问题7. IEEE 1003.1.2013年。开放小组。
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/231200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档