Linux配置Supervisor

Linux配置Supervisor

  • Ubuntu配置Supervisor
    • Ubuntu安装Supervisor
    • app启动项配置详解:
    • Supervisor相关命令
    • web管理任务
  • Centos7配置Supervisor
    • 1. 安装 Supervisor
    • 2. 配置 Supervisor
      • 常见问题
    • 4. app配置文件
      • 配置示例
      • supervisorctl执行错误
    • 5. Supervisor 管理进程
      • Web管理
    • 实验案例1:配置halo博客
      • 配置halo自启
    • 实验案例2:配置ding
      • 配置ding自启

Ubuntu配置Supervisor


Ubuntu安装Supervisor

使用supervisor设置脚本开机自启

# Ubuntu安装Supervisor
apt install -y supervisor

# supervisor开机自启:
systemctl enable --now supervisor

管理应用的配置
进入到/etc/supervisor/conf.d目录,创建管理应用的配置,可以创建多个应用配置。

cd /etc/supervisor/conf.d

# 创建app.conf配置。
touch app.conf

app启动项配置详解:

参考地址: https://cikeblog.com/supervisor.html

# 程序的名字,在supervisor中可以用这个名字来管理该程序。
[program:app]
#程序的启动目录,相当于在该目录下执行程序
directory = /usr/local/bin
# 程序的启动命令,与命令行启动的命令是一样的
command = /usr/local/bin/app -config-file /etc/confd/app.conf
# 在 supervisord 启动的时候也自动启动
autostart = true
# 启动 5 秒后没有异常退出,就当作已经正常启动了
startsecs = 5
# 程序异常退出后自动重启
autorestart = true
# 启动失败自动重试次数,默认是 3
startretries = 3
# 用哪个用户启动
user = root
# 把 stderr 重定向到 stdout,默认 false,是否将程序错误信息重定向的到文件
redirect_stderr = true
# stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20MB
# stdout 日志文件备份数
stdout_logfile_backups = 20
stdout_logfile = /var/log/app.out.log
# 程序错误信息输出到该文件
stderr_logfile = /var/log/app.err.log

# 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
environment = PYTHONPATH=$PYTHONPATH:/path/to/somewhere

Supervisor相关命令

# 重载supervisor
supervisorctl reload

# 更新app配置
supervisorctl update

# 查看状态
supervisorctl status

# 启动所有/指定的程序进程
supervisorctl start [all]|[指定app名]
## 启动指定app
supervisorctl start test

# 关闭所有/指定的程序进程
supervisorctl stop [all]|[指定app名]

# 启动supervisor
supervisord

# 通过配置文件启动supervisor
supervisord -c supervisor.conf
## -n 前台运行
## -c 指定配置
supervisord -n -c supervisor.conf

web管理任务

参考文献:https://www.jianshu.com/p/b2a2bd0c81c5
https://blog.csdn.net/jackghq/article/details/62937208
https://www.centos.bz/2018/06/centos7-3%E9%85%8D%E7%BD%AEsupervisor%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E9%97%AE%E9%A2%98/

# 修改配置文件
/etc/supervisor/supervisord.conf

# 添加下列配置
[inet_http_server]
# 对所有ip都可以访问
port=0.0.0.0:9001 
# 指定web管理端登录用户名
username=admin
# 指定web端管理密码
password=admin

重载supervisor

# 最后重载supervisor
supervisorctl reload

Centos7配置Supervisor


1. 安装 Supervisor

Supervisor 的文档地址:http://www.supervisord.org/

# 启用epel库
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 安装supervisor
yum install -y supervisor

# 开机自启
sudo systemctl enable --now supervisord

有时候Centos7的epel源搜索不到该软件包,从https://centos.pkgs.org/7/epel-x86_64/supervisor-3.4.0-1.el7.noarch.rpm.html下载rpm安装包.

# Centos7下载rpm安装包
wget -c https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/s/supervisor-3.4.0-1.el7.noarch.rpm

2. 配置 Supervisor

Supervisor 的配置文件为:/etc/supervisord.conf

Supervisor 所管理的应用的配置文件放在/etc/supervisord.d/目录中,这个目录可以在 supervisord.conf 中配置。

在这里插入图片描述


常见问题

如果在启动的时候遇到如下错误:

Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program

使用以下命令:

# 查找supervisor.sock文件
find / -name supervisor.sock

# 找到supervisor.sock,然后unlink即可
unlink /path/supervisor.sock

4. app配置文件

Supervisor 管理应用的进程,需要对每个应用进行配置。在/etc/supervisord.d中创建helloworld.ini,每个应用对应一个配置文件即可。

下面是配置文件的示例:
配置文件中的可执行程序尽量使用绝对路径

# 程序的名称
[program:helloworld] 
# 执行的命令
command = /usr/bin/dotnet HelloWorld.dll 
# 程序工作目录
directory = /root/www/ 
# 环境变量
environment = ASPNETCORE__ENVIRONMENT=Production 
# 执行进程的用户
user = root 
# 停止方式
stopsignal = INT
# 结束子进程(下面两项配置)
stopasgroup=true
killasgroup=true
# 是否自动启动
autostart=true 
# 是否自动重启
autorestart=true 
# 自动重启间隔
startsecs=1 
# 错误输出路径
stderr_logfile=/var/log/helloworld.err.log 
# 日志输出路径
stdout_logfile=/var/log/helloworld.out.log 

配置示例

Linux配置Supervisor_第1张图片

创建好配置文件后,重启 Supervisor

# 重启Supervisor
sudo systemctl restart supervisord
# 或热重启,不会重启其他子进程
supervisorctl reread
# 使用update命令,也会启动脚本
supervisorctl update

supervisorctl执行错误

参考:https://learnku.com/articles/48865

出现 error: , [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224 错误

# 解决方法使用下面命令启动
/usr/bin/python2 /usr/bin/supervisord -c /etc/supervisord.conf

同时要保证*.ini 配置文件中的空格程序路径目录是否正确/存在;
为确保没有错误,可以正常启动,使用前文提到的查看Supervisor状态的命令查看。或者查看要管理的进程是否启动,本例中可以使用下面的命令:

# 查看app的运行状态
supervisorctl status

# 查看程序进程状态
ps -ef | grep HelloWorld.dll
# 或
ps -ef | grep dotnet

5. Supervisor 管理进程

有两种方式可以管理进程,命令行和Web管理。

# 关闭所有任务
supervisorctl shutdown

# 暂停任务/开始任务
supervisorctl stop|start program_name

# 查看所有任务状态
supervisorctl status

Web管理

启用 Web 管理,首先将/etc/supervisord.conf配置文件中的inet_http_server节点取消注释。

# 修改后更新app
supervisorctl update

# 重载app
supervisorctl reload

下面是第三方SupervisorWeb管理工具
cesi : https://github.com/Gamegos/cesi
suponoff : https://github.com/GambitResearch/suponoff
gosuv : https://github.com/codeskyblue/gosuv
supervisord-monitor : https://github.com/mlazarov/supervisord-monitor
supervisord-monitor改进版 : https://github.com/WisZhou/supervisord-monitor


实验案例1:配置halo博客

# 安装jdk
sudo yum install java-11-openjdk -y

# 创建halo服务用户
useradd halo

# 修改/opt/halo属主属组为halo
chown halo.halo -R /opt/halo

# 创建halo配置文件
touch /etc/supervisord.d/halo.ini

配置halo自启

将配置粘贴到/etc/supervisord.d/halo.ini

# 程序的名称
[program:halo] 
# 执行的命令
command = java -jar /opt/halo/halo.jar
# 命令执行的目录
directory = /home/halo
# 执行进程的用户
user = halo
# 停止方式
stopsignal = INT
# 是否自动启动
autostart = true
# 结束子进程(下面两项配置)
stopasgroup=true
killasgroup=true
# 是否自动重启
autorestart = true 
# 自动重启间隔
startsecs = 1 
# 错误输出路径
stderr_logfile = /var/log/halo.err.log 
# 日志输出路径
stdout_logfile = /var/log/halo.out.log 

实验案例2:配置ding

# 拉取代码
git clone https://ghproxy.com/https://github.com/open-dingtalk/pierced.git

# 删除多余的组件
cd pierced/ && rm mac_64/ windows_64/ -rf

## 移动到opt目录
mkdir /opt/ding -p && mv linux/ /opt/ding/

## 创建ding服务账号
useradd -M -s /sbin/nologin

## 设置/ding权限
chown ding:ding -R /opt/ding && chmod 777 /opt/ding/linux/ding

配置ding自启

# 程序的名称
[program:halo]
# 执行的命令
command = /ding/linux/ding -config=/ding/linux/ding.cfg -subdomain=blog_tmp2705 8090
# 执行进程的用户
user = ding
# 停止方法
stopsignal = INT
# 结束子进程(下面两项配置)
stopasgroup=true
killasgroup=true
# 是否自动启动
autostart = true
# 是否自动重启
autorestart = true
# 自动重启间隔
startsecs = 1
# 错误输出路径
stderr_logfile = /var/log/halo.err.log
# 日志输出路径
stdout_logfile = /var/log/halo.out.log

你可能感兴趣的:(RHEL7,Linux实用工具,linux)