MacOS daemon 配置

2022-02-23

背景

MacOS daemon 使用 plist 文件(一种 xml 格式的文件,全称为 property list)来定义, 放入几个指定的目录,具体目录的位置决定了这个 plist 对应的是一个 Agent 还是一个 Daemon, Agent 和 Daemon 的唯一区别是他们的存放位置,以及为谁服务, Agent 只为当前登录的用户服务, Daemon 则是为 root 或者指定的用户服务。

目录位置

~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons /System/Library/LaunchAgents /System/Library/LaunchDaemons 一般情况下,不需要去动/System 下的 agents 或者 daemons。

加载在系统级别的地方最好 它从 /System/Library/LaunchDaemons/ 和 /Library/LaunchDaemons/ 中找到的属性列表文件加载每个按需启动系统级守护程序的参数。

plist 文件说明

一般关注几项主要的配置即可:

Label - 标志名称 Program - 运行的程序是哪个 RunAtLoad - 是否在加载的同时启动

<?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.exx.frpc</string>

        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/share/frpc</string>
            <string>-c</string>
            <string>/usr/local/share/frpc.ini</string>
        </array>
        <key>KeepAlive</key>
        <true />
        <key>RunAtLoad</key>
        <true />
        <key>UserName</key>
        <string>root</string>
        <key>StandardOutPath</key>
        <string>/var/log/myjob.log</string>
        <key>StandardErrorPath</key>
        <string>/var/log/myjob.log</string>
        <key>Debug</key>
        <true />
    </dict>
</plist>

以上是一个最简版的 plist 配置实例

备注

launchd 不使用 shell 运行程序;它使用 exec 系统调用。这就是上面的 plist 使用数组的原因。

如果正在将该数组的单个元素设置为包含空格的字符串,这会导致 launchd 尝试 exec("/usr/local/bin/ruby /Users/radek/Sites/sinatrasvn/web.rb")— 这不是文件名

操作

plist 只是配置,要执行这些配置,需要使用 launchctl 命令, 它运行你罗列信息, 加载,卸载,启动和关闭 agents 或者 daemons

获取信息

sudo launchctl list 返回结果类似于:

1230    -   com.apple.speech.speechsynthesisd
353     -   com.apple.security.cloudkeychainproxy3
255     -   com.apple.secd
-       0   com.apple.sbd

第一列表示进程号,如果有在结果中罗列,但没有数字而只是一个横线,标志虽然已经 loaded, 但没有运行;

第二列是上次退出的状态号(the last exit code), 0 表示成功,正数表示错误退出, 负数表示收到信号后退出。

命令

// 加载
sudo launchctl load ~/Library/LaunchAgents/com.cxx.frpc.plist
// 卸载
sudo launchctl unload ~/Library/LaunchAgents/com.cxx.frpc.plist
// 查看结果
cat /var/log/myjob.log
// 强制启动
launchctl load -F ~/Library/LaunchAgents/com.cxx.frpc.plist

// 启动
launchctl start com.example.app
// 停止
launchctl stop com.example.app

References

  1. Daemons and Agents
  2. Mac OS X: Launchd Is Cool https://apple.stackexchange.com/questions/112982/how-to-find-out-what-launch-agent-or-daemon-is-starting-a-process
copyright ©2019-2024 shenzhen
粤ICP备20041170号-1