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]

위의 한 줄짜리 코드는 bash 명령줄에서 실행하면 제대로 작동하며 작동 및 이메일에 구성된 계정이 /etc/mailrc수신되었음을 확인했습니다. 하지만 저는 일정에 따라 실행되기를 원하며 ~/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

Systemd 지원 옵션킬 모드, 기본값은 control-group입니다. 로 설정한 경우

KillMode=process

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

답변3

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

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

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

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

관련 정보