Mac OS X:在Objective-C或C中,如何卸载(停止)由launch启动的LaunchDaemon

时间:2013-04-09 21:14:19

标签: objective-c macos launchd

我想知道如何编写Objective-C或C代码来卸载(停止)LaunchDaemon。 我要卸载的LaunchDaemon以root用户身份运行。

我的问题基本上与这个问题相同:How to Load LaunchDaemon plist from my Mac Application。唯一的区别是他/她正在尝试加载,但我想卸载。

2 个答案:

答案 0 :(得分:2)

你可以使用applescript

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

答案 1 :(得分:2)

从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,如果要阻止,直到作业被卸载 - 这可能需要很长时间。