私のアーチ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]
/etc/mailrc
上記のコード行は、bashコマンドラインから実行し、職場で設定されたアカウントを確認し、電子メールを受信すると正常に機能します。しかし、私はスケジュールに従って実行したいと思い、〜/bin/virusscan.shというスクリプトを呼び出すシステムサービスデバイスと、毎晩午前2時にスクリプトを実行するシステムタイマーデバイスを設定しました。パイプの後ろのmailx部分は常に報告します。... email not sent
SystemDがスクリプトを実行する方法に大きな違いはありますか?
/usr/lib/systemd/system/virusscan.service
[Unit]
Description=Daily virus scan
[Service]
Type=simple
ExecStart=/home/username/bin/virusscan.sh
[Install]
WantedBy=multi-user.target
/usr/lib/systemd/system/virusscan.timer
[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はスクリプトのコード行を別々のプロセスに分割し、メッセージの件名行と見積もられた文字列を展開し、引用符を削除するようです。それが問題かもしれません。たぶん、私は正しくエスケープするだけです...そして、サービスユニットの実行が完了したら、常に最後に次の行があります...
Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent
ベストアンサー1
~によるとアーチスウィキmailx ブランチと systemd は、スクリプトの終了時に基本プロセスを終了します。 mailx 呼び出しに -v を追加するとフォークが防止されるように見えますが、systemd で動作させるより正しい方法は、mailx の引数に -Ssendwait を追加することです。