使用 supervisord 设置应用开机启动

以前一直是用 systemd 设置开机启动的服务,因为它不需要装额外的软件,方便。

但是最近遇到个问题,就是我还需要在 OS X 上设置 Jenkins Agent 的开机自启,为此专门学习了下 launchctl 的使用,最后还是功亏一篑,败在了环境变量设置这一步——不知道为啥,我在 /Library/LaunchDaemons/io.jenkinsagent.plist 里设置的 EnvironmentVariables 字段无法生效,搞了半天没找到问题。

今天才突然想起,为何不用 supervisord 呢?!关键这个还跨平台,一份配置稍微改改就可以同时用在 MacOS 和 Linux 上。

一、MacOS X 安装 supervisord

显然我不希望自己再写个 LaunchDaemons 的 plist 文件来把 supervisord 弄成开机自启。好在 homebrew 有提供傻瓜式方案,安装方式如下:

brew services  # homebrew 的 service 让我们脱离手工编写 plist 的“低级趣味”。
brew install supervisor  # 安装 supervisord
brew services start supervisor  # 借助 service 使 supervisor 开机启动

homebrew services 的详细使用方法可见 github- homebrew service

如需加速安装,可参考 homebrew 清华镜像源使用说明

安装启动后,可查看 supersivor 的配置文件 /usr/local/etc/supervisord.ini,如需添加自启动程序,可将配置文件添加到 /usr/local/etc/supervisor.d/ 中,该文件夹中的配置会被主配置文件 include.

详细的说明见后。

使用 supervisord

编写配置文件

注意:属性名称错误,不会给出任何提示!!!所以无法运行时,请仔细检查配置中的属性是否有拼写错误!

以 Jenkins-Agent 为例,编写 /usr/local/etc/supervisor.d/jenkins-agent.ini,内容如下:

[program:jenkins-agent]
command=/bin/bash /Users/jenkins/jenkins_home/connect.sh  ; 从 jenkins web 页面复制的连接命令
autostart=true
startsecs=5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart=true   ; 程序异常退出后自动重启
startretries=3     ; 启动失败自动重试次数,默认是 3
stopasgroup=true
redirect_stderr=true  ; 将 stderr 重定向到 stdout
stdout_logfile=/Users/jenkins/jenkins_home/jenkins-agent.log   ; 日志输入位置
stdout_logfile_maxbytes=1MB
environment=PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

supervisor 启动服务时,只会包含系统的环境变量。而上面的配置文件,显然也并不方便设置多个环境变量。
因此推荐的做法是在启动脚本中进行相关的环境设置:

# connect.sh 的内容

# java for jenkins-agent
export PATH="/Applications/openjdk8/Contents/Home/bin:$PATH"

# flutter
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH="/Applications/flutter/bin:$PATH"

# connect jenkins master
cd /Users/jenkins/jenkins_home/
# 下面是 jenkins 连接命令
java -jar agent.jar -jnlpUrl ......

这样就能在启动程序前,设置好需要的环境。

启用配置

通过 supervisorctl 操作 supervisor:

  1. 连接 supervisor 后端:supervisorctl -c /usr/local/etc/supervisord.ini,注意必须指定启动 supervisor 时用的配置文件。
  2. 然后就可以通过 help 查看 supervisorctl 支持的命令了,常用的有 reload 重载配置,restart all 重启所有应用。

通过 start all 就可以启动配置好的应用了。

二、Linux 安装 supervisor

一般建议通过包管理器安装,好处是不用手写 systemd 配置,缺点是更新太慢。

sudo apt-get install supervisor  # 安装
sudo systemctl enable supervisor  # 启用开机启动
sudo systemctl start supervisor   # 现在启动

如果需要新版本的功能,可以通过 pip 安装最新版,但是需要手动编写 systemd 配置(或者先用 apt-get 装老版本,把 systemd 配置拷下来)。详见 installing supervisor

使用方法

用法见前面的 MacOS X,基本上可以套用,只有如下几个区别:

  1. 默认的配置文件路径不同,主配置文件是 /etc/supervisor/supervisord.conf,自定义配置路径 /etc/supervisor/conf.d/*.conf
  2. 注意 Linux 中配置的后缀是 .conf,而在 OS X 中默认使用 .ini

画外:Windows 呢?

Windows 也有自己的 Service 功能,不过就和 OS X 的 launchd 一样,我对它的了解程度小于 1%。

因此同样依靠懒人方法,推荐使用 winsw

不过目前这个方法我还没用过,因为目前没有啥需要设置成 Windows Serivce 的应用。

posted @ 2020-01-21 15:00  於清樂  阅读(3027)  评论(0编辑  收藏  举报