이것은 Big Sur를 실행하는 iMac에서 수행되었습니다. (AskDifferent에 물어봤는데 아무도 답을 몰라요.)
이 스크립트는 Raspberry Pi에서 실행되는 NUT(Network UPS Tool) 서버에서 배터리 데이터를 가져오기 위해 launchd에 의해 하루에 한 번 실행되도록 설정되어 있습니다.
#!/bin/bash
# Shell script to query upsmon regarding ups battery status
log=/Users/mnewman/ups/ups.log
email="[email protected]"
echo `date` "UPS Check">> $log
# get UPS data from Raspsky
bat=`/usr/local/bin/upsc apcups@raspsky | \
grep -E 'battery.charge:|input.voltage:'`
# write USB data to the log
echo $bat >> $log
# send an email
echo "$bat" | /usr/bin/mail -s "UPS Status" $email
exit 0
스크립트는 명령줄에서 제대로 실행됩니다. 자동으로 실패하는 이메일 라인을 제외하고는 launchd에서 실행됩니다. 콘솔 로그에는 아무것도 없고 stderr에는 아무것도 없습니다. 이메일이 전송되지 않았습니다.
그러나 자세한 정보 표시 모드에서 mail 명령을 실행하면 다음과 같습니다.
echo "$bat" | /usr/bin/mail -v -s "UPS Status" $email
잘 작동합니다.
또는 이메일 줄 뒤에 다른 명령을 추가하는 경우:
curl -sS https://api.prowlapp.com/publicapi/add \
-F apikey=$apikey -F application=$(hostname) -F event="UPS" \
-F description="$bat"
잘 작동합니다.
여기서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있나요?
답변1
나는 이것을 다른 곳에서 배웠다. 그것은 밝혀:
<key>AbandonProcessGroup</key><true/>
launchd plist 파일에 추가해야 합니다. 작업이 완료되면 launchd는 작업과 동일한 프로세스 그룹 ID를 가진 나머지 프로세스를 종료합니다. 이 설정은 이 동작을 비활성화합니다. 문제는 메일이 메일을 보내기 위해 하위 프로세스를 시작하고 스크립트 실행이 완료될 때 하위 프로세스가 아직 완료되지 않았을 수 있다는 것입니다. launchd가 하위 프로세스를 종료하면 메일이 전송되지 않습니다. 이것이 OP에서 설명한 상황에서 일어나는 일입니다. 내 생각엔 Mail을 장황한 모드로 실행하거나 Mail 줄 뒤에 다른 명령을 추가하면 Mail이 이메일 전송을 완료할 때까지 스크립트를 오랫동안 활성 상태로 유지할 수 있을 것 같습니다.