MailX não está enviando e-mail quando executado como um serviço Systemd

0

Eu tenho um shell script 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 for executado na linha de comando bash e eu confirmei que a conta configurada em /etc/mailrc funciona e o email é recebido. Mas eu quero que ele seja executado em um cronograma e eu configurei uma unidade de serviço do systemd para chamar um script chamado ~ / bin / virusscan.sh e uma unidade de timer do systemd para ativá-lo às 2 da manhã todas as noites. A parte do mailx após o pipe está sempre reportando ... email not sent

Existe uma diferença significativa em 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 eu posso executar o serviço imediatamente para testar com:

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 no script em processos separados e também expande a string que deveria ser a linha de assunto da mensagem e remove as aspas ... Esse poderia ser o problema, talvez, e Eu só preciso escapar corretamente ... Então, quando a unidade de serviço terminar, eu sempre tenho a seguinte linha no final ...

Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent
    
por λ Jonas Gorauskas 04.10.2016 / 21:06

3 respostas

3

De acordo com o Arch Wiki mailx forks e o systemd mata o processo principal quando o script é encerrado. Parece que adicionar -v à chamada mailx impede que ele bifurque, mas a maneira mais correta de fazê-lo funcionar com o systemd é adicionar -Ssendwait aos argumentos do mailx.

    
por 19.04.2017 / 14:50
1

Existem alguns benefícios em usar o systemd timers vs cron em termos de lidar com o registro para você e bons relatórios de status.

O systemd tem uma configuração de ambiente $ PATH mais restritiva por padrão comparado ao cron.

Nos seus exemplos, você especificou apenas caminhos completos, por isso não fica imediatamente claro que esse é o problema. No entanto, mailx provavelmente está chamando alguns outros binários que espera encontrar no $ PATH.

Parece que mailx suporta a opção --debug-level , que você pode definir como trace7 para obter a saída máxima de depuração.

    
por 05.10.2016 / 17:27