我想知道如何编写 Objective-C 或 C 代码来卸载(停止)一个 LaunchDaemon。我要卸载的 LaunchDaemon 以 root 用户身份运行。
我的问题与这个问题基本相同:How to Load LaunchDaemon plist from my Mac Application。唯一的区别是他/她正在尝试加载,但我想卸载。
我想知道如何编写 Objective-C 或 C 代码来卸载(停止)一个 LaunchDaemon。我要卸载的 LaunchDaemon 以 root 用户身份运行。
我的问题与这个问题基本相同:How to Load LaunchDaemon plist from my Mac Application。唯一的区别是他/她正在尝试加载,但我想卸载。
你可以使用苹果脚本
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
- 这可能需要很长时间。