次のサービスを設定しました。
[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' [email protected] && exit -1)"
Restart=on-failure
[Install]
WantedBy=multi-user.target
何らかの理由でプロセスがゼロ以外のシャットダウンで終了すると、コマンドはメールを送信mail
しません。これは、scollector
コマンドラインから実行または呼び出すとうまく機能します。/bin/sh
STDOUTとSTDERRをキャプチャしましたが、mail
エラーは発生しません。中には何もありませんmaillog
。
何を提供しますか?なぜ電子メールを送信しないのですか?
ベストアンサー1
/usr/bin/mail
デュアルfork
デーモンを実行してsendmail
電子メールを送信します。プロセスsendmail
は再所有されているため、init
通常は元の親プロセスで発生したことに影響されません。ただし、再所有された孫が依然として元のサービスと同じcgroupにあるsystemdの場合は例外です。何かを解体すると、systemd
再所有したプロセスを含むcgroup内のすべてのプロセスが終了しますsendmail
。
コマンドmail
自体は正しく実行されましたが、sendmail
そのタスクを実行する機会がある前にsystemdによって終了しました。
KillMode
Unit
セクションで(デフォルト)を設定してprocess
この問題を解決できますcontrol-group
。これにより、systemd
直接トリガーされたプロセスのみが終了します。
面白いことは、私がこれを使用する方法で偶然発見したことですstrace
。strace
通常は何も表示されませんが、mail
使用すると突然動作し始めましたstrace -f
。strace -f
すべての子供と孤児孫が完了するまで、基本的なプロセスは維持されます。