
Eu tenho um script de shell que executa uma varredura clamav em uma pasta no meu sistema Arch Linux e deve enviar os resultados por e-mail. Aqui está o 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]
O one-liner acima funciona bem se executado na linha de comando do bash e eu confirmei que a conta configurada em /etc/mailrc
funciona e o e-mail foi recebido. Mas quero que ele seja executado de acordo com uma programação e configurei uma unidade de serviço do systemd para chamar um script chamado ~/bin/virusscan.sh e uma unidade de timer do systemd para acioná-lo às 2 da manhã todas as noites. A peça mailx após o pipe está sempre reportando... email not sent
Existe uma diferença significativa na forma como o SystemD executa o script?
/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
Então posso executar o serviço imediatamente para testar:
sudo systemctl start virusscan
E o status do serviço durante a execução é o seguinte:
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 o SystemD quebra o único liner do script em processos separados e também expande a string que deveria ser a linha de assunto da mensagem e remove as aspas ... Esse pode ser o problema, talvez, e eu só preciso para escapar corretamente ... Aí quando a unidade de serviço termina de rodar, sempre tenho a seguinte linha no final ...
Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent
Responder1
De acordo comArco Wikimailx forks e systemd matam o processo principal quando o script é encerrado. Parece que adicionar -v à chamada mailx evita que ela seja bifurcada, mas a maneira mais correta de fazê-lo funcionar com o systemd é adicionar -Ssendwait aos argumentos do mailx.
Responder2
Opção de suporte do SystemdModo Matar, cujo padrão é grupo de controle. Se definido para
KillMode=process
isso não interromperá o processo bifurcado quando o script for concluído.
Responder3
Existem alguns benefícios em usar temporizadores do systemd versus cron em termos de manipulação do registro para você e bons relatórios de status.
O systemd tem uma configuração de ambiente $PATH mais restritiva por padrão em comparação com o cron.
Nos seus exemplos, você especificou apenas caminhos completos, portanto não está imediatamente claro se esse é o problema. No entanto, mailx
provavelmente está chamando alguns outros binários que espera encontrar no $PATH.
Parece que mailx
suporta uma --debug-level
opção que você pode definir trace7
para obter a saída máxima de depuração.