我在macOS中运行了守护进程服务。
在外部事件中,它使用launchctl load
此服务的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
的上下文和值,我不明白它是什么。
知道为什么吗?
答案 0 :(得分:0)
尝试将-F
选项与launchctl
:
sudo launchctl unload -F /Library/LaunchAgents/...
-F 强制加载或卸载plist。 忽略 已禁用密钥。
如果您不使用-F
,那么您可能首先需要禁用已加载的守护程序,然后将其卸载。