MailX не отправляет электронную почту при запуске в качестве службы Systemd

MailX не отправляет электронную почту при запуске в качестве службы Systemd

У меня есть скрипт оболочки, который запускает сканирование clamav в папке на моей системе Arch Linux и должен отправлять результаты по электронной почте. Вот код:

/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 выполняет скрипт?

/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 убивает основной процесс при выходе из скрипта. Похоже, добавление -v к вызову mailx предотвращает разветвление, но более правильный способ заставить его работать с systemd — добавить -Ssendwait к аргументам mailx.

решение2

Systemd поддерживает опциюKillMode, который по умолчанию является control-group. Если установлено значение

KillMode=process

он не завершит ответвленный процесс после завершения скрипта.

решение3

Использование таймеров systemd по сравнению с cron имеет некоторые преимущества с точки зрения обработки журналов и создания удобных отчетов о состоянии.

systemd по умолчанию имеет более строгие настройки среды $PATH по сравнению с cron.

В ваших примерах вы указали только полные пути, поэтому не сразу понятно, что проблема в этом. Однако, mailxвероятно, вызывает какие-то другие двоичные файлы, которые он ожидает найти в $PATH.

Похоже, он mailxподдерживает --debug-levelопцию, которую можно установить trace7для получения максимального отладочного вывода.

Связанный контент