2012-03-13 3 views
1

OSX에서 LaunchDaemon으로 실행하고 싶은 응용 프로그램이 있습니다. 내 plist는 다음과 같습니다 :Launchd plist 서비스가 종료되지 않습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>KeepAlive</key> 
    <false/> 
    <key>Label</key> 
    <string>my.service</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/servertest/MyService</string> 
     <string>-jvm</string> 
     <string>server</string> 
     <string>-nodetach</string>  
     <string>-outfile</string> 
     <string>out.txt</string> 
     <string>-errfile</string> 
     <string>err.txt</string> 
     <string>-verbose</string> 
     <string>-debug</string> 
     <string>-home</string> 
     <string>/System/Library/Frameworks/JavaVM.framework/Home</string> 
     <string>-cp</string> 
     <string>./lib/hsqldb.jar:./lib/myservice-wrapper.jar:./lib/commons-daemon-1.0.8.jar</string> 
     <string>my.service.DaemonMac</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>StandardErrorPath</key> 
    <string>/servertest/stderr.log</string> 
    <key>StandardOutPath</key> 
    <string>/servertest/stdout.log</string> 
    <key>WorkingDirectory</key> 
    <string>/servertest</string> 
</dict> 
</plist> 

서비스는 "launchctl start my.service '를 호출 할 때 시작됩니다. 하지만 'launchctl stop my.service'를 사용하거나 plist를 언로드 할 때 다운되지 않습니다. 아무 일도 일어나지 않는 것처럼 그것은 기억 속에 남아 있고 달린다. 이유가 무엇인지 모릅니다. 도와주세요!

답변

1

나를 위해 일한 파일은 다음과 같습니다. 나는 내 deamon이 자신을 프로세스를 제어하는 ​​것으로부터 분리해서는 안된다는 것을 배웠고 "OnDemand"가 되어야만하므로 내가 원할 때 멈출 수있다. 나는 그것에 종사하는 동안 무당 춤을 만들었지 만 그것이 어느 시점에서 작동하기 시작했는지는 분명하지 않습니다. 이제는 그렇습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>KeepAlive</key> 
    <false/> 
    <key>Label</key> 
    <string>myserver</string> 
    <key>OnDemand</key> 
    <true/> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/opt/MYServer/MYServer</string> 
     <string>-server</string> 
     <string>-outfile</string> 
     <string>/opt/MYServer/out.txt</string> 
     <string>-errfile</string> 
     <string>/opt/MYServer/err.txt</string> 
     <string>-verbose</string> 
     <string>-debug</string> 
     <string>-nodetach</string> 
     <string>-home</string> 
     <string>/System/Library/Frameworks/JavaVM.framework/Home</string> 
     <string>-cp</string> 
     <string>/opt/MYServer/lib/hsqldb.jar:/opt/MYServer/lib/my-wrapper.jar:/opt/MYServer/lib/commons-daemon-1.0.8.jar</string> 
     <string>my.service.DaemonMac</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>StandardErrorPath</key> 
    <string>/opt/MYServer/stderr.log</string> 
    <key>StandardOutPath</key> 
    <string>/opt/MYServer/stdout.log</string> 
    <key>WorkingDirectory</key> 
    <string>/opt/MYServer</string> 
</dict> 
</plist> 
1

응용 프로그램이 자신을 데몬즈 처리 (예 : 배경으로 떨어 뜨림)합니까? 그렇다면, 그것은 본질적으로 발사로부터 분리되어 발사가 발사되지 못하게합니다.

EDIT : 응용 프로그램이 자체적으로 대몬 비를하지 않는 경우, 다음으로 봐야 할 것은 launchd가 launchctl list my.service으로 어떤 일이 벌어지고 있는지 생각해 보는 것입니다. 이것은 PID (launchd가 실행 중임을 생각할 경우) 및 LastExitStatus (마지막으로 실행 한 종료시의 여부)를 포함하여 데몬의 등록 정보 목록을 덤프해야합니다. PID가 실제 실행중인 프로세스와 일치합니까? 서비스를 중지하려고 할 때 결과가 변경됩니까 (특히 PID가 0으로 변경됩니까)? 프로세스 목록 (예 : ps -axj)에 부모 이탈 후 거주하는 하위 프로세스가 표시됩니까?

아, 그리고 LaunchDaemons를 관리 할 때 sudo launchctl을 사용해야합니다 (sudo를 사용하지 않으면 launchctl이 사용자 세션에서 LaunchAgent를 관리하려고 시도합니다).

+0

MyService 'in plist의 이름이 jsvc executable로 변경되었습니다. 내 응용 프로그램이 Java로되어 있으므로 사용해야합니다. jsvc 명령 줄 스위치 중에 '-nodetach'옵션이 있는데, 사용하지 않으면 서비스를 시작할 수 없습니다. –

+0

지금은 다른 작업을하고 있지만 나중에이 작업으로 돌아갑니다. 응답 해 주셔서 감사합니다. –