如何设置已经运行的二进制文件以在启动时运行

时间:2019-05-31 16:00:35

标签: macos go launchd launchctl

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

它是用Go编写的,实际上并没有多大关系,我遇到的主要问题是在Mac启动时让二进制文件(已经运行)运行。

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

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

({cp plist进入LaunchAgents目录)

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

(然后用launchctl加载plist。)

那很好。唯一的问题是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>

1 个答案:

答案 0 :(得分: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,因此不应加载。

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

要启用:

  • RunAtLoad设置为true
  • cp plist上方

要禁用:

  • RunAtLoad设置为false
  • cp plist上方

有点hacky,但是可以用。