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