2013-04-09 2 views
1

Objective-C 또는 C 코드를 작성하여 LaunchDaemon을 언로드 (중지)하는 방법을 알고 싶습니다. 언로드하려는 LaunchDaemon이 루트 사용자로 실행 중입니다.Mac OS X : Objective-C 또는 C에서 시작된 OpenDaemon을 언로드 (중지)하는 방법

제 질문은 기본적으로이 질문과 같습니다 : How to Load LaunchDaemon plist from my Mac Application. 유일한 차이점은 그/그녀가 적재하려고하는 것이지만 나는 내려야한다는 것입니다. 당신은 당신이 SMJobRemove 기능을 사용할 수 있습니다 C에서 AppleScript로에게

do shell script "launchctl unload /Library/LaunchDaemons/com.yourcompany.app.plist" with administrator privileges 
+0

C 코드 :'setuid (0); 시스템 ("launchctl unload /Path/to/daemon.plist"); ' –

+0

감사합니다, H2CO3. 하지만 그건 효과가없는 것 같습니다. – ytw

+0

프로그램에 루트 권한이 있습니까? –

답변

2

. 작업이 시스템 launchd 컨텍스트에있는 경우 (예 :/Library/LaunchDaemons에 있고 시스템 시작시로드되지 않은 경우로드 됨) 권한 서비스를 사용하여 kSMRightModifySystemDaemons 권한을 획득하고 권한 참조를 다음 위치로 전달해야합니다. 이 함수. 당신이 작업이 언로드-이 될 때까지 잠재적으로 시간이 오래 걸릴 수 차단하려면

AuthorizationItem authItem = { .name = kSMRightModifySystemDaemons, 
     .valueLength = 0, 
     .value = NULL, 
     .flags = kAuthorizationFlagDefaults }; 
    AuthorizationRights authRights = { .count = 1, 
     .items = &authItem }; 

    AuthorizationRef authorization = NULL; 
    OSStatus authResult = AuthorizationCreate(&authRights, 
              kAuthorizationEmptyEnvironment, 
              kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights, 
              &authorization); 
    if (authResult != errAuthorizationSuccess) { 
     NSLog(@"couldn't create AuthorizationRef: error %i", authResult); 
    } else { 
     CFErrorRef error = NULL; 
     BOOL removeResult = SMJobRemove(kSMDomainSystemLaunchd, jobLabel, authorization, waitOrNot, &error); 
     AuthorizationFree(authorization, kAuthorizationFlagDefaults); 
     // handle either success or failure 
    } 

waitOrNot 플래그는 YES로 설정해야합니다.

2

을 사용할 수 있습니다

+0

제안을 해주셔서 감사합니다. 나는 이미 Parag Bafna의 대답을 오래 전에 사용했지만 대답으로 표시하는 것을 잊어 버렸다. – ytw