간단한 bash 스크립트를 작성하여 프로그램 (유일한 인수로 제공)이 실행 중인지 확인하고 스크립트가 아닌 경우 설정된 주소로 이메일을 보냅니다. 스크립트는 명령 줄에서 실행되면 작동하지만 일생 동안 스크립트를 실행하도록 설정하는 사용자 에이전트 (~ / Library / LaunchAgents)로 작동시킬 수는 없습니다. 관련 .plist 파일의 최신 화신은 (Dropbox 모니터링)입니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>greencollar.Dropbox.checkRun</string>
<key>StartInterval</key>
<integer>60</integer>
<key>Program</key>
<string>/Users/greencollar/Documents/code/proc_check.sh</string>
<key>ProgramArguments</key>
<array>
<string>proc_check.sh</string>
<string>Dropbox</string>
</array>
</dict>
</plist>
예-bash 스크립트는 실행 가능하며 .plist 파일에 문제가 있음을 나타내는 항목이 콘솔에 없습니다. 나는 / bin / bash 프로그램을 만들려고 시도했지만 아무런 차이가없는 것 같고 execvp (3)를 읽는 것이 그렇지 않다는 것을 암시하는 것처럼 보인다. 나는 또한 <ProgramArguments>
운없이 모든 것을 아래에 두려고 노력했다 . 이것이 나에게 매우 기본적으로 보이고 도움이되지 않아 매우 도움이 될 것입니다!
—————————– 1 차 편집 ——————- ——–
쉘 스크립트의 기본 사항은 다음과 같습니다.
#!/bin/bash
PROC=$1
if ! /usr/bin/pgrep $PROC > /dev/null
then
/bin/echo "$PROC is not running!" | /usr/bin/mail -s "$PROC down" email@mydomain
fi
별로 잘못하지는 않습니다 …
답변
나는 이것을 코멘트로 게시하기 때문에 답변으로 게시하고 있으며 proc_check.sh
쉘 스크립트 의 내용을 보지 않아도 문제가 무엇인지 알고 있다고 생각 합니다.
첫 번째 답변을 삭제 한 후 질문을 다시 읽고 주석을 작성한 후 힌트 는 스크립트 가 명령 줄에서 작동했지만 호출 할 때 힌트 가 아니라는 것을 알았습니다 launchd
.
사용자 에이전트 .plist
파일이 트리거되면 $PATH
수신 한 파일 에 스크립트 내에서 호출되는 일부 명령 / 유틸리티에 대한 경로가 포함되지 않을 수 있습니다 . $PATH
에 전달 proc_check.sh
쉘 스크립트가 아니라 :
/usr/bin:/bin:/usr/sbin:/sbin
따라서 위에 있지 않거나 스크립트 에 정규화 된 경로 이름을$PATH
포함 하는 스크립트 에서 호출 된 프로그램은에 의해 호출 될 때 실행되지 않습니다 .launchd
이 문제를 해결하려면 위의에없는 스크립트 내에서 호출 된 모든 실행 파일에 대해 완전한 경로 이름 을 사용 하거나 터미널에서 실제 출력이있는 곳 다음 에 명령문을 추가하십시오 .$PATH
PATH=...
shebang
...
echo $PATH
#!/bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
참고 : $PATH
위 의 내용은 echo $PATH
내 시스템 에서 출력되는 내용이며 사용자의 시스템과 다를 수 있습니다.
답변
이것을 멀리 얻은 후에는 launchd에 의해 메일이 호출되는 데 문제가 있었으므로 검색하여 이것을 참조한 것을 발견 했습니다 . 그것은 이었다 .plist 그것이 메일 프로세스가 충분히 일을 할 살 수 있도록 할 것 AbandonProcessGroup 키를 포함하지 않았 음에 파일. 첨가
<key>AbandonProcessGroup</key>
<true/>
작동하게 만들었습니다.
타사 앱에서 생성 한 .plist를 사용하여 “시간을 절약”한다는 점에서이를 위해 스스로 설정했습니다. 이러한 앱은 제작 한 .plist 파일에서 항상 완전하거나 정확하지는 않습니다.
도움을 주신 @ user3439894 & @Mark에게 감사합니다.