1

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

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

4

2 回答 2

2

你可以使用苹果脚本

do shell script "launchctl unload /Library/LaunchDaemons/com.yourcompany.app.plist" with administrator privileges
于 2013-05-31T06:44:00.627 回答
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- 这可能需要很长时间。

于 2013-05-31T06:53:56.933 回答