
Tengo un script de shell que ejecuta un análisis clamav en una carpeta de mi sistema arch linux y se supone que envía los resultados por correo electrónico. Aquí está el código:
/usr/bin/clamscan -r -i /path/to/folder | /usr/bin/mailx -A gmail -s "Clam Scan Results $(/usr/bin/date +%F)" [email protected]
La frase anterior funciona bien si se ejecuta en la línea de comando de bash y confirmé que /etc/mailrc
se recibió la cuenta configurada en Works y el correo electrónico. Pero quiero que se ejecute según un cronograma y configuro una unidad de servicio systemd para llamar a un script llamado ~/bin/virusscan.sh y una unidad de temporizador systemd para activarlo a las 2 a.m. todas las noches. La pieza de mailx después de la tubería siempre informa... email not sent
¿Existe una diferencia significativa en cómo SystemD ejecuta el script?
/usr/lib/systemd/system/virusscan.servicio
[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
Entonces puedo ejecutar el servicio inmediatamente para probar con:
sudo systemctl start virusscan
Y el estado del servicio mientras se ejecuta es el siguiente:
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.
Parece que SystemD divide la línea del script en procesos separados y también expande la cadena que se supone que es la línea de asunto del mensaje y elimina las comillas... Ese podría ser el problema, tal vez, y solo necesito para escaparlo correctamente... Luego, cuando la unidad de servicio termina de ejecutarse, siempre tengo la siguiente línea al final...
Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent
Respuesta1
De acuerdo aWiki Arcomailx se bifurca y systemd finaliza el proceso principal cuando se cierra el script. Parece que agregar -v a la llamada de mailx evita que se bifurque, pero una forma más correcta de hacerlo funcionar con systemd es agregar -Ssendwait a los argumentos de mailx.
Respuesta2
Systemd admite la opciónModo matar, que por defecto es grupo de control. Si se establece en
KillMode=process
no finalizará el proceso bifurcado cuando finalice el script.
Respuesta3
Hay algunos beneficios al usar systemd timers vs cron en términos de manejar el registro por usted y buenos informes de estado.
systemd tiene una configuración de entorno $PATH más restrictiva de forma predeterminada en comparación con cron.
En sus ejemplos, solo ha especificado rutas completas, por lo que no queda inmediatamente claro que este sea el problema. Sin embargo, mailx
es probable que esté llamando a otros binarios que espera encontrar en $PATH.
Parece que mailx
admite una --debug-level
opción que puede configurar trace7
para obtener el máximo resultado de depuración.