从同步任务(launchdaemon)卸载LaunchAgent

时间:2018-04-23 16:31:57

标签: linux bash macos sudo launchd

我在macOS中运行了守护进程服务。 在外部事件中,它使用launchctl load

从另一个launchDaemon plist运行脚本

此服务的plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.my.uninstall</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/Library/myprod/uninstall.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>5</integer>
</dict>
</plist>

在脚本本身中,我希望卸载launchAgent服务的每个用户的所有实例(此服务具有每个用户的进程)。卸载命令如下所示:

#!/bin/sh

for current_user in `/usr/bin/users`; 
do    
sudo -u $current_user /bin/launchctl unload /Library/LaunchAgents/com.myprod.agent.plist
done

但是此命令不成功,服务仍然存在。 但是从shell命令行手动执行,工作得很好。

为了调试问题,我检查了日志并追踪了工作和非工作命令的产生:

工作:

sudo:     root : TTY=unknown ; PWD=/ ; USER=myself ; COMMAND=/bin/launchctl unload /Library/LaunchAgents/com.myprod.agent.plist

无工作:

sudo:     root : TTY=ttys004 ; PWD=/Users/myself/Desktop ; USER=myself ; COMMAND=/bin/launchctl unload /Library/LaunchAgents/com.myprod.agent.plist

我认为命令应该成功,因为两种情况下的脚本都以root身份运行。唯一的区别在于tty的上下文和值,我不明白它是什么。

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

尝试将-F选项与launchctl

一起使用
sudo launchctl unload -F /Library/LaunchAgents/...
  

-F 强制加载或卸载plist。 忽略                          已禁用密钥。

如果您不使用-F,那么您可能首先需要禁用已加载的守护程序,然后将其卸载。