MailX는 Systemd 서비스로 실행될 때 이메일을 보내지 않습니다.

MailX는 Systemd 서비스로 실행될 때 이메일을 보내지 않습니다.

내 아치 리눅스 시스템의 폴더에서 clamav 스캔을 실행하고 결과를 이메일로 보내는 쉘 스크립트가 있습니다. 코드는 다음과 같습니다.

/usr/bin/clamscan -r -i /path/to/folder | /usr/bin/mailx -A gmail -s "Clam Scan Results $(/usr/bin/date +%F)" [email protected]

/etc/mailrc위의 코드 줄은 bash 명령줄에서 실행하고 직장에서 구성된 계정을 확인하고 이메일을 받으면 제대로 작동합니다 . 하지만 저는 일정에 따라 실행되기를 원하며 ~/bin/virusscan.sh라는 스크립트를 호출하는 시스템 서비스 장치와 매일 밤 오전 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는 스크립트가 종료될 때 기본 프로세스를 종료합니다. mailx 호출에 -v를 추가하면 포크가 방지되는 것처럼 보이지만 systemd에서 작동하도록 하는 더 올바른 방법은 mailx의 인수에 -Ssendwait를 추가하는 것입니다.

답변2

시스템 지원 옵션살인 모드, 기본값은 제어 그룹입니다. 로 설정한 경우

KillMode=process

스크립트가 완료된 후에 분기된 프로세스를 종료하지 않습니다.

답변3

로깅 처리 및 양호한 상태 보고 측면에서 cron보다 시스템 타이머를 사용하면 몇 가지 이점이 있습니다.

Systemd에는 cron에 비해 기본적으로 더 엄격한 $PATH 환경 설정이 있습니다.

귀하의 예에서는 전체 경로만 지정했으므로 이것이 문제인지는 즉시 명확하지 않습니다. 그러나 mailx$PATH에서 찾을 것으로 예상되는 다른 바이너리를 호출할 수도 있습니다.

최대 디버그 출력을 위해 설정할 수 있는 옵션을 mailx지원하는 것 같습니다 .--debug-leveltrace7

관련 정보