MailX が Systemd サービスとして実行されているときにメールを送信しない

MailX が Systemd サービスとして実行されているときにメールを送信しない

私の Arch Linux システム上のフォルダーで Clamav スキャンを実行し、結果を電子メールで送信するシェル スクリプトがあります。コードは次のとおりです。

/usr/bin/clamscan -r -i /path/to/folder | /usr/bin/mailx -A gmail -s "Clam Scan Results $(/usr/bin/date +%F)" [email protected]

上記のワンライナーは、bashコマンドラインで実行すれば問題なく動作し、設定されたアカウントが/etc/mailrc動作し、メールが受信されることを確認しました。しかし、私はこれをスケジュール通りに実行したいので、systemdサービスユニットを設定して~/bin/virusscan.shというスクリプトを呼び出し、systemdタイマーユニットを設定して毎晩午前2時にこれをトリガーします。パイプの後のmailx部分は常にレポートしています。... email not sent

SystemD がスクリプトを実行する方法に大きな違いはありますか?

ウイルススキャンサービス

[Unit]
Description=Daily virus scan

[Service]
Type=simple
ExecStart=/home/username/bin/virusscan.sh

[Install]
WantedBy=multi-user.target

ウイルススキャンタイマー

[Unit]
Description=Execute virus scan daily at 2 AM

[Timer]
OnCalendar=*-*-* 02:00:00
Unit=virusscan.service

[Install]
WantedBy=multi-user.target

次に、サービスをすぐに実行してテストします。

sudo systemctl start virusscan 

実行中のサービスのステータスは次のようになります。

virusscan.service - Daily virus scan
   Loaded: loaded (/usr/lib/systemd/system/virusscan.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-10-04 11:54:39 PDT; 11s ago
 Main PID: 29915 (virusscan.sh)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/virusscan.service
           ├─29915 /bin/sh /home/username/bin/virusscan.sh
           ├─29920 /usr/bin/clamscan -r -i /path/to/folder/
           └─29921 /usr/bin/mailx -A gmail -s Clam Scan Results 2016-10-04 [email protected]

Oct 04 11:54:39 hurricane systemd[1]: Started Daily virus scan.

SystemD はスクリプト内の 1 行を別々のプロセスに分割し、メッセージの件名となるはずの文字列を展開して引用符を削除するようです...おそらくこれが問題かもしれません。適切にエスケープする必要があります...その後、サービス ユニットの実行が完了すると、最後に常に次の行が表示されます...

Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent

答え1

によるとアーチウィキmailx はフォークし、スクリプトが終了すると systemd はメイン プロセスを強制終了します。mailx 呼び出しに -v を追加するとフォークが防止されるようですが、systemd で動作させるより正しい方法は、mailx の引数に -Ssendwait を追加することです。

答え2

Systemdはオプションをサポートキルモード、デフォルトはコントロールグループです。

KillMode=process

スクリプトが終了しても、フォークされたプロセスは終了しません。

答え3

ログ処理や適切なステータス レポートの点で、cron ではなく systemd タイマーを使用するといくつかの利点があります。

systemd では、cron と比較して、デフォルトでより制限的な $PATH 環境設定があります。

例では、完全なパスのみを指定しているため、これが問題であることはすぐにはわかりません。ただし、mailx$PATH で見つかると予想される他のバイナリを呼び出している可能性があります。

最大限のデバッグ出力を得るために設定できるオプションをmailxサポートしているようです。--debug-leveltrace7

関連情報