
У меня есть скрипт оболочки, который запускает сканирование 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
для получения максимального отладочного вывода.