Mac OSX의 launchctl을 사용하여 서비스를 시작하는 방법


5

구성 plist 파일이 launchctl을 사용하여 서비스로로드되지 않는 이유는 무엇입니까?

OSX Yosemite를 실행 중이며 launchctl http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/ 사용에 대한 훌륭한 자습서를 읽었습니다.

서비스 구성으로 올바른 .plist 파일을 만들었습니다 (수년 전에 만든 작업 plist 구성 파일의 거의 정확한 사본이기 때문에 이것이 옳다는 것을 알고 있습니다). 나는 입력

launchctl load ~/Library/LaunchAgents/com.apple.myservice.plist

응답하다

~/Library/LaunchAgents/com.apple.myservice.plist: File exists

그것은 엄청나게 묘사 적이지는 않지만 나는 가고 타이핑한다.

launchctl start com.apple.myservice

출력이없고 아무 일도 일어나지 않습니다. 나는 또한 사용하려고했습니다

launchctl enable ~/Library/LaunchAgents/com.apple.myservice.plist

그리고 난 그냥 얻을

Usage: launchctl enable <service-target>

답으로.

OSX Yosemite에서 실행 된 서비스를로드하기위한 올바른 구문으로 응답 할 수 있습니까?


3
아마 load -w도움이 될 것입니다. "수년 전에 생성 한 plist 설정 파일의 거의 정확한 사본이기 때문에 이것이 옳다는 것을 알고 있습니다."에 대한 값을 변경 Label했으면합니다. 주문형 서비스가 아닌가? plist파일 을 보여 주셔야 합니다. 또한 launchctl enable경로를 기대하지 않습니다. 같은 것들을 볼 수 user/<uid>/[service-name]있는 man launchctl, 또는 참조 의 차이 무엇입니까 service-name그리고는 service-target? .
Arjan

2
또한 .plist그룹 및 세계별로 파일을 쓸 수 없는지 확인하십시오 . 그리고 애플이 제공 한 서비스가 아니라면 com.apple미래에는 사용 이 혼란 스러울 것입니다.
Arjan

... 그리고 마지막으로 : File exists실행하려는 프로세스의 일부 출력이 아닌가? 콘솔은 무엇을 말합니까? 결국 : 우리는 단지 그 plist파일 을 볼 필요가 있습니다.
Arjan

@Arjan, 필자는 이전에 사용한 올바른 파일에서 .plist 파일의 레이블을 변경하는 것을 잊었습니다. "파일이 있습니다"출력을 설명합니다. 이제 올바른 레이블로 변경되었으므로 예상대로 작동합니다. 내 원래의 질문에 답하고 싶을 경우, 올바른 것으로 받아들입니다.
almel

당신의 내용이 표시되지 않은 com.apple.myservice.plist서비스를 시작하는 시스템의 규칙은 무엇인가되어 이렇게 질문을? 시작시기를 어떻게 정의 했습니까?
Marek R

답변:


4

나는 오늘 비슷한 문제에 부딪쳤다.

서비스를 언로드하고 다시로드하면 문제가 File exists해결됩니다.

plist 파일을 업데이트 할 때마다 그렇게해야합니다.


4

launchd "이상한"상태로 쉽게 들어갈 수 있습니다.

  • load구성 파일 을 읽고 잠재적 으로 실행을 예약 하는 것을 의미합니다 .
  • unload구성 파일을 예약 stop 하고 예약을 해제하는 수단
  • start 서비스를 시작합니다 (일정을 무시하고 믿습니다)
  • stop 일정을 무시하고 서비스를 중단합니다.

일반적으로 "다시 시작"하려면 다음과 같이 구성을 언로드하고 다시로드하십시오.

launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist

-w변화가 재부팅에 영향을 미치는 것을 의미 수단 "쓰기"(모든 로그인 또는 부팅을로드 ... 또는 로그인 또는 부팅시 다시로드되지 않습니다).

시스템 수준의 서비스 인 경우 ( /Library/LaunchDaemons또는 /Library/LaunchAgents그와 함께 sudo해야 할 수도 있습니다. 실수로 sudo없이 수행 한 경우 sudo없이 언로드 한 다음 sudo로 다시로드해야 할 수도 있습니다)

에 원인이 파일의 핵심 startload있다 RunAtLoad(그리고 KeepAlive어떤 이유로 죽으면 실행을 유지)

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>

그것은 그 자체 launchctl에서 디버그 로깅을 얻기 위해 때로는 까다로운하지만 키 StandardErrorPathStandardOutPath할 수있는 응용 프로그램 (예를 들어, 확장되지 않은 환경 변수 또는 비 쓰기 경로)로 인해 누락되거나 잘못된 정보로 죽어 가고 있는지 알 수 적어도 도움이됩니다. 프로세스를 실행하는 사용자가 지정한 경로를 쓸 수 있는지 확인하십시오.

<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>

그것들은 디버깅하기가 어렵 기 때문에 LaunchControl을 사용 하거나 launchd.info올바르게 읽은 후 시작 하고 혼합하는 것이 좋습니다 .

또한 여기에는 여러 가지 디버깅 힌트가 있습니다. https://serverfault.com/questions/183589/how-do-i-activate-launchd-logging-on-os-x

아직 직접 시도하지는 않았지만이 솔루션은 가장 단순 해 보입니다.

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