duanmu0834 2019-05-31 16:00
浏览 141
已采纳

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

I have a Go program that is supposed to run as a daemon with minimal front-end for the user (just an icon in the system tray.)

The fact that it's written in Go doesn't really matter much, the main issue I have is getting a binary (that is already running) to run at startup on a Mac.

I can set the binary to run at startup like so:

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

(cp the plist into the LaunchAgents directory)

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

(then load the plist with launchctl.)

And that works fine. The only issue is that launchctl load it starts another instance of the binary that is already running. I want to be able to enable (and disable) running the binary at startup for the binary that is running, without starting another instance of it.

And here's the .plist file if you want to see it:

<?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条回答 默认 最新

  • dop82210 2019-05-31 17:40
    关注

    I figured it out.

    So first, the binary is running. It starts out as not enabled to run at startup. To initialize, you cp the plist to the ~/Library/LaunchAgents/ directory:

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

    And the plist looks like this:

    <?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>
    

    NOTE: The RunAtLoad key is set to false.

    Then we load it into launchctl:

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

    It shouldn't load since RunAtLoad is set to false.

    Then, we can enable and disable running at startup like so:

    To enable:

    • Set RunAtLoad to true
    • cp the plist over

    To disable:

    • Set RunAtLoad to false
    • cp the plist over

    Kind of hacky, but it works.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵