启动守护程序赢得';不能从Bash脚本加载,但将从终端加载

启动守护程序赢得';不能从Bash脚本加载,但将从终端加载,bash,macos,launchd,launchctl,Bash,Macos,Launchd,Launchctl,我在从PKG安装程序运行的安装后Bash脚本文件中有一行代码: launchctl load /Library/LaunchDaemons/com.mycompany.myapp.plist PKG正确安装作业plist文件和作业调用的小程序 但当我检查作业是否加载到终端时,我没有得到以下结果: launchctl list | grep mycompany 如果我在终端中执行相同的load命令,作业将按预期加载 为什么在脚本运行时未加载作业?当您以普通用户身份运行launchctl lis

我在从PKG安装程序运行的安装后Bash脚本文件中有一行代码:

launchctl load /Library/LaunchDaemons/com.mycompany.myapp.plist
PKG正确安装作业plist文件和作业调用的小程序

但当我检查作业是否加载到终端时,我没有得到以下结果:

launchctl list | grep mycompany
如果我在终端中执行相同的load命令,作业将按预期加载


为什么在脚本运行时未加载作业?

当您以普通用户身份运行
launchctl list
时,它会列出在您的用户会话中运行的启动代理;要列出启动守护程序,请以root用户身份运行它(即
sudo launchctl list

更多详细信息:一些
launchctl
子命令允许您明确指定要处理的域。例如:

launchctl print system      # Prints Launch *Daemons*
launchctl print user/501    # Prints Launch *Agents* for user #501's session
launchctl load /path/to/plist         # Loads the plist as an Agent in my user session
launchctl list                        # Lists Agents in my user session
sudo launchctl load /path/to/plist    # Loads it as a Daemon in the system domain
sudo launchctl list                   # Lists Daemons in the system domain
但较旧的“遗留”子命令,如
list
load
unload
start
stop
,等早于此约定,并使用命令运行时的用户ID来确定要操作的域。例如:

launchctl print system      # Prints Launch *Daemons*
launchctl print user/501    # Prints Launch *Agents* for user #501's session
launchctl load /path/to/plist         # Loads the plist as an Agent in my user session
launchctl list                        # Lists Agents in my user session
sudo launchctl load /path/to/plist    # Loads it as a Daemon in the system domain
sudo launchctl list                   # Lists Daemons in the system domain

您的包可能以root用户身份运行其脚本,因此它将以守护进程的形式加载作业(这是您想要的),但它可以完全取决于包的配置方式。

当您以普通用户身份运行
launchctl list
时,它会列出在您的用户会话中运行的启动代理;要列出启动守护程序,请以root用户身份运行它(即
sudo launchctl list
)。顺便说一句,
launchctl-load
的工作方式相同;如果您以普通用户身份运行它,它将作为代理加载作业,但如果您以root用户身份运行它,它将作为守护进程加载作业。您的包可能是以root用户身份运行其脚本(这是您想要的),但它可能完全取决于包的配置方式。OMG。哥顿戴维森的灯泡时刻!如果你把它贴出来作为答案,我会把它标记为答案。非常感谢你。我已经盯着这个看了一天了,作为一个办公室赢家!再次感谢你@GordonDavisson。非常有用。我刚刚发现,要掌握launchctl,还需要了解位置的细微差别,如文档所示:
~/Library/LaunchAgents per user agent由用户提供/管理员提供的每个用户代理的库/启动代理/由管理员提供的库/启动守护程序系统范围的守护程序/每个用户代理的系统/库/启动代理OS X/系统/库/启动守护程序OS X系统范围的守护程序。
@JamieGarroch MVP Correct;请参见我对各种库文件夹的描述。但请注意,macOS的最新版本允许启动代理(可能还有守护进程?)从普通库子文件夹以外的位置加载。顺便说一句,如果这回答了你的问题,请。在意识到启动作业运行的小程序需要访问$HOME位置后,我将旧命令扔进垃圾箱,并选择新命令如下:
launchctl bootstrap gui/501~/Library/LaunchAgents/com.mycompany.myproduct.plist
标记为已接受(谢谢提醒!)