簡體   English   中英

Mac OS X:在Objective-C或C中,如何卸載(停止)由launch啟動的LaunchDaemon

[英]Mac OS X: In Objective-C or C, how to unload (stop) a LaunchDaemon managed by launched

我想知道如何編寫Objective-C或C代碼來卸載(停止)LaunchDaemon。 我要卸載的LaunchDaemon以root用戶身份運行。

我的問題基本上與這個問題相同: 如何從我的Mac應用程序加載LaunchDaemon plist 唯一的區別是他/她正在嘗試加載,但我想卸載。

你可以使用applescript

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

從C開始,您可以使用SMJobRemove函數。 如果作業位於系統啟動上下文中(即它位於/ 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 - 這可能需要很長時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM