还在用nohup? 来试试Supervisor吧 -Linux后台运行

2,337 阅读2分钟

转载: www.leroyling.com/archives/Su…

进程管理工具Supervisor

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

Supervisor的安装

(1)安装Python包管理工具(easy_install)

ps 如果没有安装的话

yum install python-setuptools

(2)安装Supervisor

easy_install supervisor

配置Supervisor应用守护

(1)通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件

mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

(2)然后新建一个conf.d的文件夹

mkdir /etc/supervisor/conf.d

(3)然后查看路径下的supervisord.conf。

在文件尾部添加如下配置。

...
;[include]
;files = relative/directory/*.ini

;conf.d 为配置表目录的文件夹,需要手动创建
[include]
files = conf.d/*.conf

(4)为你的程序创建一个.conf文件,放在目录"/etc/supervisor/conf.d/"下

touch your-application-name.conf

配置文件的内容如下

[program:your-application-name] ;程序名称,终端控制时需要的标识
command= java -jar your-application-name.jar ; 运行程序的命令
directory=/root/your-application-pwd ; 你的程序所在的命令执行的目录路径
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/your-application-name.err.log ; 错误日志文件,路径可以自己定义
stdout_logfile=/var/log/your-application-name.out.log ; 输出日志文件,路径可以自己定义
user=root ; 进程执行的用户身份
stopsignal=INT

(5)配置文件搞定之后,运行supervisord,查看是否生效

supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep your-application-name

ps 如果服务已启动,修改配置文件可用“supervisorctl reload”命令来使其生效

supervisorctl reload

配置Supervisor开机启动

(1)进入到以下目录

cd /usr/lib/systemd/system

(2)新建一个supervisord.service文件

touch supervisord.service

编辑文件内容

[Unit]
Description=Supervisor

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

(3) 执行命令

systemctl enable supervisord

(4) 执行命令来验证是否为开机启动

systemctl is-enabled supervisord

附录-常用的相关管理命令

supervisorctl restart <application name> ;重启指定应用
supervisorctl stop <application name> ;停止指定应用
supervisorctl start <application name> ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用