추가 읽기

추가 읽기

다음 서비스를 구성했습니다.

[Unit]
Description=SCollector
After=NetworkManager.service

[Service]  
Type=simple
ExecStart=/bin/sh -c "/opt/scollector/scollector /opt/scollector/collectors || (echo '' | /usr/bin/mail -s 'scollector died' [email protected] && exit -1)"
Restart=on-failure

[Install]
WantedBy=multi-user.target    

어떤 이유로 프로세스가 0이 아닌 종료로 종료되면 mail명령은 메일을 보내지 않습니다 . 이는 scollector명령줄에서 실행하거나 호출할 때 잘 작동합니다. /bin/shSTDOUT 및 STDERR을 캡처했는데 mail오류가 발생하지 않습니다. 안에는 아무것도 없습니다 maillog.

무엇을 제공합니까? 왜 이메일을 보내지 않나요?

답변1

/usr/bin/mail듀얼 fork데몬을 실행하여 sendmail이메일을 보냅니다. 프로세스 sendmail는 다시 소유되므로 init일반적으로 원래 상위 프로세스에 발생하는 어떤 일에도 영향을 받지 않습니다. 단, 다시 소유된 손자가 여전히 원래 서비스와 동일한 cgroup에 있는 systemd의 경우는 예외입니다. 무언가를 해체 하면 systemd다시 소유한 프로세스를 포함하여 cgroup 내의 모든 프로세스가 종료됩니다 sendmail.

명령 mail자체는 제대로 실행되었지만 sendmail해당 작업을 수행할 기회를 갖기도 전에 systemd에 의해 종료되었습니다.

KillModeUnit섹션에서 (기본값)을 설정하여 process이 문제를 해결할 수 있습니다 control-group. 이렇게 하면 systemd직접 트리거된 프로세스만 종료 됩니다 .

재미있는 점은 내가 이것을 사용하는 방식으로 우연히 발견했다는 것입니다 strace. strace일반적으로 아무것도 표시되지 않지만 mail사용하면 갑자기 작동하기 시작했습니다 strace -f. strace -f모든 자녀와 고아 손주가 완료될 때까지 기본 프로세스가 유지됩니다.

답변2

질문자는 문제를 지적했지만 xyr 솔루션은 딜레마이며 xyr은 역학을 잘못 설명합니다.

mail명령은 참입니다아니요이중 포크를 수행합니다. 한 번만 포크되고 sendmail shim 프로세스는 그것의 직계 자식이며 어떤 것도 다시 부모로 만들지 않습니다. 단지 waitpid()떠나기 전에 그 아이에게 서비스를 제공할지 여부를 선택합니다.

sendmail shim 자체도 마찬가지입니다. 이중 포크는 되지 않습니다. 일부 MTS에서는 전혀 포크조차 발생하지 않습니다. 다른 시스템에서는 한 번만 분기하고 구성 가능한 "배달 모드" 옵션에 의존할지 여부를 선택합니다.

이 문제를 해결하는 두 가지 올바른 방법이 있습니다.

  1. mailx로깅 및 정규화 옵션 집합입니다 sendwait. sendmail shim 하위 프로세스가 완료될 때 까지 mailx기다리면 비동기 대기열 문제가 구체적으로 해결됩니다. (불행히도 이 옵션은 최소한 1986년부터 있었고 mailxSVID에 문서화되어 있지만 bsd-mailx에는 이 옵션이 없습니다. 그러나 heirloom-mailx에는 있습니다.)
  2. 아직 사용 중이 아닌 경우 동기 대기열/배달 모드를 사용하도록 사용 중인 MTS를 설정합니다.
    • netqmail을 사용하는 경우 아무 작업도 수행되지 않습니다. Netqmail의 sendmail shim은 항상 대기열에 있고 동기화되며 직접 체인 로드되며 qmail-inject전혀 qmail-queue분기되지 않습니다.
    • Postfix를 사용하는 경우 아무 작업도 수행하지 않습니다. Postfix의 sendmail shim은 항상 대기열에 있고 동기화되며 한 번 분기되고 postdrop종료되기 전에 완료될 때까지 기다립니다.
    • exim에는 -odf명령줄 옵션이 있습니다.

추가 읽기

관련 정보