追加読書

追加読書

次のサービスを設定しました。

[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/shSTDOUTとSTDERRをキャプチャしましたが、mailエラーは発生しません。中には何もありませんmaillog

何を提供しますか?なぜ電子メールを送信しないのですか?

ベストアンサー1

/usr/bin/mailデュアルforkデーモンを実行してsendmail電子メールを送信します。プロセスsendmailは再所有されているため、init通常は元の親プロセスで発生したことに影響されません。ただし、再所有された孫が依然として元のサービスと同じcgroupにあるsystemdの場合は例外です。何かを解体すると、systemd再所有したプロセスを含むcgroup内のすべてのプロセスが終了しますsendmail

コマンドmail自体は正しく実行されましたが、sendmailそのタスクを実行する機会がある前にsystemdによって終了しました。

KillModeUnitセクションで(デフォルト)を設定してprocessこの問題を解決できますcontrol-group。これにより、systemd直接トリガーされたプロセスのみが終了します。

面白いことは、私がこれを使用する方法で偶然発見したことですstracestrace通常は何も表示されませんが、mail使用すると突然動作し始めましたstrace -fstrace -fすべての子供と孤児孫が完了するまで、基本的なプロセスは維持されます。

おすすめ記事