zoukankan      html  css  js  c++  java
  • 使用 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 的应用。

  • 相关阅读:
    从Pycharm说起
    前端工程师小A学习JS的旅程
    模板引擎开发(一)
    Bootstrap01
    Passbook详解与开发案例
    DLL文件知多少?
    C#中的索引器的简单理解和用法
    python 的列表遍历删除
    Node.js与Golang使用感受与小结1
    解决设计中的两难问题
  • 原文地址:https://www.cnblogs.com/kirito-c/p/12170126.html
Copyright © 2011-2022 走看看