launchd를 사용하여 실행중인 프로그램 또는 프로세스 모니터링


1

간단한 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

별로 잘못하지는 않습니다 ...


ProgramArguments의 첫 번째 인수로 전체 경로로 실행 했습니까? 또한 스크립트에 대한 권한은 무엇입니까? (쉬운 방법은 LaunchControl 또는 다른 프로그램을 사용하여 스크립트를 편집하는 것입니다)
Mark

1
또한 당신이 실행되지 않는다고 말할 때-그것이 실행되는지 어떻게 알 수 있습니까?
Mark

3
실제 이메일 주소비밀번호 등과 같이 민감한 것을 위해 적절한 자리 표시자를 두려면 다른 것을 생략하지 말고 proc_check.sh쉘 스크립트 의 내용을 포함하도록 질문을 편집하십시오 . 그것 없이는 쉽게 또는 문제가있는 곳에서 가능한 정확하게 복제하려고 시도하는 완전한 문제 해결 프로세스를 수행 할 수 없습니다.
user3439894 2016 년

@ Mark, 지금 삭제 된 이전 답변에 대한 의견에 감사드립니다. 그것은 .plist문제에 대한 문제를 보았 기 때문에 내가하지 않은 것을 인정하고 그 문제를 시험해 보았습니다 (어쨌든 내 시스템에서). 그래서 나는 그것이 문제가 있다고 생각하지 않습니다. 내가 생각하는 새로운 대답은 문제가 어디에서 발생할 수 있는지에 대한 것일 수 있습니다. 분명히 스크립트 의 내용을 보지 않고도 확실하게 말할 수는 없지만 문제가있을 수 있습니다.
user3439894

1
내가 테스트 한 모두 .plistproc_check.sh내 사용, $HOME물론 경로의 휴식을, 그리고 호출 할 때이 작품 launchd "Caculator"와 함께 테스트에 나를 위해 say $PROC is not running. 시스템이 설정하지 않았기 때문에 이메일 전송을 테스트하지 않았습니다. 따라서 내가 작동하는지 확인한 다음 문제 해결을 수행하는 mail경우에 의해 트리거 될 때 처리 방법에 대해 문제 해결을 수행해야합니다 launchd. BTW OS X 10.8.5를 실행하고 있습니다. 어떤 버전을 실행하고 있습니까?
user3439894

답변:


2

나는 이것을 코멘트로 게시하기 때문에 답변으로 게시하고 있으며 proc_check.sh 쉘 스크립트 의 내용을 보지 않아도 문제가 무엇인지 알고 있다고 생각 합니다.

첫 번째 답변을 삭제 한 후 질문을 다시 읽고 주석을 작성한 후 힌트스크립트 가 명령 줄에서 작동했지만 호출 할 때 힌트 가 아니라는 것을 알았습니다 launchd.

사용자 에이전트 .plist파일이 트리거되면 $PATH수신 한 파일 에 스크립트 내에서 호출되는 일부 명령 / 유틸리티에 대한 경로가 포함되지 않을 수 있습니다 . $PATH에 전달 proc_check.sh 쉘 스크립트가 아니라 :

/usr/bin:/bin:/usr/sbin:/sbin

따라서 위에 있지 않거나 스크립트정규화 된 경로 이름을$PATH 포함 하는 스크립트 에서 호출 된 프로그램은에 의해 호출 될 때 실행되지 않습니다 .launchd

이 문제를 해결하려면 위의에없는 스크립트 내에서 호출 된 모든 실행 파일에 대해 완전한 경로 이름 을 사용 하거나 터미널에서 실제 출력이있는 곳 다음 에 명령문을 추가하십시오 .$PATHPATH=...shebang...echo $PATH

#!/bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

참고 : $PATH위 의 내용은 echo $PATH내 시스템 에서 출력되는 내용이며 사용자의 시스템과 다를 수 있습니다.


지금까지 의견을 보내 주셔서 감사합니다. 스크립트를 가장 간결한 필수 요소로 수정하고 모든 실행 파일의 전체 경로를 입력했지만 여전히 작동하지 않습니다. 스크립트는 다음과 같습니다 #!/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 . 스크립트를 잘못 편집하면 매분마다 콘솔 메시지가 나타납니다. 그러나 나는 무엇이 잘못되었는지 알 수 없습니다.
GAM

@GAM, 주석이 아닌 올바른 형식의 구조로 질문에 스크립트를 추가하십시오.
user3439894

2

이것을 멀리 얻은 후에는 launchd에 의해 메일이 호출되는 데 문제가 있었으므로 검색하여 이것을 참조한 것을 발견 했습니다 . 그것은 이었다 .plist 그것이 메일 프로세스가 충분히 일을 할 살 수 있도록 할 것 AbandonProcessGroup 키를 포함하지 않았 음에 파일. 첨가

<key>AbandonProcessGroup</key>
<true/>

작동하게 만들었습니다.

타사 앱에서 생성 한 .plist를 사용하여 "시간을 절약"한다는 점에서이를 위해 스스로 설정했습니다. 이러한 앱은 제작 한 .plist 파일에서 항상 완전하거나 정확하지는 않습니다.

도움을 주신 @ user3439894 & @Mark에게 감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.