0

我有一个 Go 程序,它应该作为一个守护进程运行,为用户提供最少的前端(只是系统托盘中的一个图标。)

它是用 Go 编写的这一事实并不重要,我遇到的主要问题是让一个二进制文件(已经在运行)在 Mac 上启动时运行。

我可以将二进制文件设置为在启动时运行,如下所示:

cp daemon.plist ~/Library/LaunchAgents/daemon.plist

cp将 plist 放入 LaunchAgents 目录)

launchctl load -w ~/Library/LaunchAgents/daemon.plist

(然后用 . 加载 plist launchctl。)

这很好用。唯一的问题是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>daemon</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/Daemon.app/Contents/MacOS/daemon</string>
    </array>
    <key>ProcessType</key>
    <string>Interactive</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>
4

1 回答 1

0

我想到了。

所以首先,二进制文件正在运行。它开始时未启用在启动时运行。要初始化,你cp到目录:plist~/Library/LaunchAgents/

cp daemon.plist ~/Library/LaunchAgents/daemon.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>daemon</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/Daemon.app/Contents/MacOS/daemon</string>
    </array>
    <key>ProcessType</key>
    <string>Interactive</string>
    <key>RunAtLoad</key>
    <false/>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

注意:该RunAtLoad键设置为false

然后我们将其加载到launchctl

launchctl load -w ~/Library/LaunchAgents/daemon.plist

它不应该加载,因为RunAtLoad设置为false.

然后,我们可以像这样启用和禁用启动时运行:

启用:

  • 设置RunAtLoadtrue
  • cpplist结束了

要禁用:

  • 设置RunAtLoadfalse
  • cpplist结束了

有点hacky,但它有效。

于 2019-05-31T17:40:37.263 回答