2011-10-25 8 views
5

나는 LaunchDaemon을 가지고 있습니다. 실행되면 SIMBL이 설치되어 있는지 확인합니다. SIMBL이 설치되어 있지 않으면 NSTask를 사용하여 SIMBL.pkg에/usr/sbin/installer를 실행합니다. 내 LaunchDaemon의 NSTask 환경이 $ 사용자가 설정되어 있지 않기 때문에,코드가 LaunchDaemon으로 실행될 때 어떻게 다시 부팅하지 않고 LaunchAgent를 시작할 수 있습니까?

sudo -u "$USER" -- /bin/launchctl load -F -S Aqua -D user "${LAUNCHD_PLIST}" 

이 실패

SIMBL의 postflight 스크립트는 즉시 SIMBL의 LaunchAgent을 시작하는 launchctl load 명령을 실행하려고합니다.

내 데몬이 시스템 구성 프레임 워크로 현재 사용자를 감지하고 setEnvironment와 NSTask에 전달하는 경우, 날 launchctl 버그 아웃 :

나는 데몬을 실현
Bug: launchctl.c:2325 (23930):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1 

, 정의, 작동하지합니다 사용자 세션에서. 마찬가지로, 애플은 LaunchAgents를 LaunchDaemons의 도우미 개체로 추천하여 해당 사용자 세션 작업을 수행하는 것으로 보입니다. 그러한 에이전트를 즉시 실행할 수있는 방법이 있습니까?

모든 .plists가 올바른 위치에 있습니다. (재부팅 후 다음 번 launchctl이 정기적으로로드되기 때문에 실행됩니다.) 그래서 처음 생각한 것은 launchctl에 다시로드하라는 것입니다. 그러나 all the code to do that is commented out in launchctl.c :

// { "reload",   reload_cmd,    "Reload configuration files and/or directories" }, 

... launchd 미친 .... 저를 구동하는 방법

* In later versions of launchd, I hope to load everything in the first pass, 
* then do the Bonjour magic on the jobs that need it, and reload them, but for now, 
* I haven't thought through the various complexities of reloading jobs, and therefore 
* launchd doesn't have reload support right now. 

답변

6

가 본론하려면 는 많은 연구와 실험 후에, 이것은 내가 어떻게 10.5+에서 수행하십시오.

10.4에서 직접 달성 할 수있는 방법이 없습니다. 나는 10.4를 속이고 GUI가 있고 당신이 그것을 할 수 없어도 (만약 당신이 어쨌든 10.4-10.6에서 할 수 있지만, 10.7에서는 할 수 없다), LaunchAgent가 실행했을 것만 실행한다. 10.4에서 LaunchAgent는 다음 재부팅 후에 올바르게 작동합니다.

위 코드는 loginwindow 프로세스를 찾고 해당 컨텍스트에서 명령을 실행하는 데 bsexec을 사용합니다. 빠른 사용자 전환에는 여러 가지 컨텍스트가있을 수 있습니다.

몇 가지 유용한 링크 :

  • Daemons and Services Programming Guide. 당신은 그것을 읽어야 만하지만 실제로 어려운 질문에는 대답하지 않을 것입니다. 그러나 그것은 적어도 당신에게 모든 것이있는 곳의 힌트를 줄 것입니다.
  • TN2083. 이것은 답이 될만한 많은 질문을 제기하는 미친 문서이지만, 심연에 들어간 사람은 누구나 launchd에 대한 복음이며 필수 읽기입니다.
  • Starting/stopping a launchd agent for all users with GUI sessions. 여기에는 몇 가지 유용한 링크와 설명이 있습니다.

IMO, launchd은 애플이 배포 한 최악의 "훌륭한 아이디어"중 하나입니다. 아이디어는 매우 유용하지만 API는 끔찍합니다.

+1

OS X "El Capitan"10.11 (15A204h)에서는 "launchctl bsexec"이 더 이상 작동하지 않는 것 같습니다.이 단계가 필요한 이유가 있습니까? – yairchu

+1

바로 컨텍스트에서 에이전트를 다시 시작하는 부분입니다. 그것 없이는 OP가 요청할 때 다시 시작하지 않습니다. 나는 10.11에서 이것이 가능한지 (만약 있다면) 어떤 것이 가능한지 모른다. –

+0

에는 10.11 :'launchctl bootstrap gui/\'stat -f % u \''와 같은 방법이있는 것 같습니다. http://stackoverflow.com/questions/1106638/starting-stopping-a-launchd-agent-for-all-users-with-gui-sessions#comment51143118_31534614 – yairchu