MailX não envia email quando executado como um serviço Systemd

MailX não envia email quando executado como um serviço Systemd

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/mailrcfunciona 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, mailxprovavelmente está chamando alguns outros binários que espera encontrar no $PATH.

Parece que mailxsuporta uma --debug-levelopção que você pode definir trace7para obter a saída máxima de depuração.

informação relacionada