实现Mac开机自动启动指定服务

本文主要讲的是macOS重新启动后, 自动运行我们指定的服务, 实现开机自启动.

比如我们要实现让hugo本地sever开机自启动.

macOS的开机自启说明文档参考: man launchd

创建并配置服务的plist文件

cat > ~/Library/LaunchAgents/localhost.hugo.plist <<'EOF'
<?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>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>localhost.hugo</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/hugo</string>
    <string>server</string>
    <string>-D</string>
    <string>--logFile=process.log</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Users/xinggang/github/sre.im</string>
</dict>
</plist>
EOF

注意:

服务的启动命令不能放置到后台, 比如启动命令结尾不能加&;

KeepAlive设置为true, 系统默认每10秒会检查一次服务进程的存活, 发现无相关进程会重新启动.

Label表示服务的名称, 一般我们以服务plist配置文件的名称即可, 不可加plist扩展名.

ProgramArguments表示带参数的命令行, 命令必需使用绝对路径, 每个参数独立一行;

WorkingDirectory表示命令在哪个目录下运行, 即工作目录, 这个路径也必需是绝对路径;

RunAtLoad表示在将该配置文件注册(load)到系统中时就运行服务的启动命令;

最后再强调一遍, 命令的路径和工作目录都必需是绝对路径, 使用$HOME~都不可以.

将配置文件注册到系统中

launchctl load ~/Library/LaunchAgents/localhost.hugo.plist

查看是否已注册成功: launchctl list|grep hugo

如果注册成功, 执行ps aux|grep hugo可发现hugo本地server已经启动了.

取消注册的命令: launchctl unload ~/Library/LaunchAgents/localhost.hugo.plist

注意:

launchctl load这个步骤可以没有, 重启后macOS会自动注册并启动.

如果我们不想让hugo开机自启动了, 需要将该文件localhost.hugo.plist移除.

总结

有很多brew安装的软件, 比如mysql, 通过brew services start mysql, 即可实现开机自启, 这个原理和上面介绍的方式是一致的. 我们可以在 ~/Library/LaunchAgents目录中找到mysql的plist文件.

对于其他无法通过brew services start的方式来实现开机自启的自定义服务, 我们就可以按照上面介绍的方式进行了, 非常友好方便.