내 아치 리눅스 시스템의 폴더에서 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
답변3
로깅 처리 및 양호한 상태 보고 측면에서 cron보다 시스템 타이머를 사용하면 몇 가지 이점이 있습니다.
Systemd에는 cron에 비해 기본적으로 더 엄격한 $PATH 환경 설정이 있습니다.
귀하의 예에서는 전체 경로만 지정했으므로 이것이 문제인지는 즉시 명확하지 않습니다. 그러나 mailx
$PATH에서 찾을 것으로 예상되는 다른 바이너리를 호출할 수도 있습니다.
최대 디버그 출력을 위해 설정할 수 있는 옵션을 mailx
지원하는 것 같습니다 .--debug-level
trace7