나는 systemd를 사용하여 다음 스크립트를 통해 서비스를 자동으로 시작하고 있습니다. (아래 참조)
서비스가 시작되기 전에 이메일을 보내려고 합니다(주석 처리된 행).
줄 끝에 있는 링크 /home/vincent/wintergreen/service_files/IB_restart_email
는 이메일의 내용입니다.여기에 명시된 바와 같이단락 7에서.
Unit]
Description=Manages an instance of IBController
[Service]
Type=forking
User=vincent
Group=vincent
ExecStart=/bin/bash -c "cd /opt/IBController && bash IBControllerStart.sh -inline && sleep 10"
# ExecStartPre=/usr/bin/mail -s "Restarting TWS" [email protected] < /home/vincent/wintergreen/service_files/IB_restart_email
Environment=DISPLAY=:0.0
KillMode=control-group
TimeoutSec=0
Restart=always
[Install]
WantedBy=graphical.target
그러나 이 줄은 오류를 반환합니다 mail: Cannot parse address <' (while expanding <'): Malformed email address
. (journalctl을 열면 오류 메시지를 볼 수 있습니다)
이 명령은 셸에서 직접 사용할 때 작동합니다. 시스템 파일에서 메일 전송 라인을 사용할 때 이것을 작동시키는 방법을 아는 사람이 있습니까?
추신: 저는 postfix
이메일을 사용하여 보냅니다.
답변1
에서 언급한 것처럼 man systemd.service
systemd는 "<"를 포함하지 않는 셸 구문을 제한적으로 지원합니다. 따라서 이 문자가 "mail" 명령으로 설정되어 이 오류가 발생합니다.
자동 재시작은 서비스 충돌로 인해 발생할 수 있으므로 이메일에 가장 관심이 있으실 것 같습니다.
이를 위해서는 이 OnFailure=
지시문이 더 나은 선택입니다. 장치가 오류 상태에 들어갈 때 활성화될 장치의 공백으로 구분된 목록을 제공하려면 이를 사용하십시오.
이 문제를 해결하기 위한 기성 솔루션이 이미 있습니다.이것서비스가 실패하면 서비스의 "상태" 출력(일부 로그 출력 포함)이 이메일로 전송됩니다.
WorkingDirectory=
또한 in 대신 이 지시문을 사용하는 것을 고려해 보십시오 ExecStart=
.
애플리케이션 실행의 일부로 "sleep 10"이 필요한 이유는 명확하지 않습니다.