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