Ubuntu 18.04 安装使用 Supervisor 进程守护并设置开机自动启动
最近需要在 Ubuntu 上配置一下进程守护,因为有些进程必须一直运行,否则就比较尴尬。于是网上搜索了一下,比较原生的做法是使用 systemd 进行配置,但是看了下操作比较繁琐,于是搜到了 Supervisor。Supervisor(http://supervisord.org)是用 Python 开发的一个 client / server 服务,是 Linux / Unix 系统下的一个进程管理工具,不支持 Windows 系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用 Supervisor 管理的进程,当一个进程意外被杀死,Supervisord 监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写 shell 脚本来控制。
本文介绍 Supervisor 的安装、配置、使用技巧,并设置 Supervisor 开机自动启动。
一、Ubuntu 安装 Supervisor
官方推荐使用 pip 或者 Python 进行安装 Supervisor,但是对于 Ubuntu 用户来说,老唐认为直接使用 apt 安装更为方便。不过使用 apt 安装的版本会比使用 pip 安装的版本低,但是我认为一样用。
老唐用的是 apt 直接安装(下文都以这个安装方式为例进行介绍):
apt install supervisor
或者你也可以使用 pip 安装:
pip install supervisor
官方安装教程:http://supervisord.org/installing.html
二、Ubuntu 配置 Supervisor
安装完成之后,会有配置文件,在 /etc/supervisor/supervisord.conf
,我们不用管,我们所需要做的,就是在 /etc/supervisor/conf.d/
这个目录下创建自己需要守护的程序的配置文件。比如我需要守护 frp 进程,我需要创建一个配置文件(建议直接使用 root 账户操作):
sudo vim /etc/supervisor/conf.d/frp.conf
配置文件内容如下:
[program:frp]
directory=/home/edge/frp_0.30.0_linux_amd64
command=sh frp.sh
autostart=true
autorestart=true
startretries=100
redirect_stderr=true
stdout_logfile=/home/edge/frp_0.30.0_linux_amd64/out.log
相信大家都能看懂,把 program 改一下,然后把 directory 和 command 改成自己的,stdou_logfile 也改成自己的,就可以了。
官方给出的详细的参数设置文档:http://supervisord.org/configuration.html
三、检查 Supervisor 状态
配置之后,我们可以检查一下 Supervisor 状态。首先确认是否运行:
ps aux | grep supervisor
一般都能看到对应进程。
其次检查守护的进程的状态:
supervisorctl
我们就可以看到我们配置的守护进程的状态,如果不在运行,会有相应的错误信息。
supervisorctl
常用命令:
命令 |
说明 |
---|---|
supervisorctl stop program_name |
停止某个进程 |
supervisorctl start program_name |
启动某个进程 |
supervisorctl restart program_name |
重启某个进程 |
supervisorctl stop all |
停止全部进程 |
supervisorctl reload |
载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程 |
supervisorctl update |
根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启 |
四、设置 Supervisor 开机自动启动
如果我们是使用 apt 安装的,一般来说会自动设置好开机启动,这也是为什么文章开头推荐使用 apt 进行安装的理由。但是如果你重启之后发现没有开机自动启动,可以按照下面的方法配置。
把下面的命令写进 rc.local 即可:
/usr/bin/supervisord
Ubuntu 配置 rc.local 参考:《Ubuntu 18.04 LTS 配置 rc.local 开机自动启动脚本》。
更多参考文献:
- https://www.cnblogs.com/xishuai/p/ubuntu-install-supervisor.html
- http://supervisord.org/introduction.html
- https://oldtang.com/2468.html
- [喵咪Golang(1)]Go语言开篇
- phalcon-进阶篇2(拦截器)
- 【死磕Java并发】—–深入分析synchronized的实现原理
- phalcon-进阶篇1(过滤与清理)
- phalcon-入门篇9(view层基础使用)
- PhalApi视频教程
- 【学术】一文搞懂自编码器及其用途(含代码示例)
- PhalApi-Zip--压缩文件处理类
- PhalApi-Xhprof -- Facebook开源的轻量级PHP性能分析工具
- OpenAI发布8个模拟机器人环境以及一种HER实现,以训练实体机器人模型
- PhalApi-APK--APK文件解包处理
- [喵咪PHP]页面显示空白问题
- 数据库中间件 Sharding-JDBC 源码分析 —— 结果归并
- PhalGo-Request
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular Component TypeScript代码和最后转换生成的JavaScript代码比较
- 如何使用Angular FormBuilder
- Angular HTML template的解析位置
- Angular FormBuilder的工作原理
- Angular HTTPClient的使用方法
- nodejs错误:PayloadTooLargeError: request entity too large
- 富文本编辑器 tinymce 的使用
- dotnet core 在 MAC 系统下删除应用程序自己后调 Process Start 方法将会抛出 Win32 异常
- 如何从高德获取地铁数据
- Yaconf - windows 环境下的高性能配置操作
- [ 物联网篇 ] 26 -ALSA Plug 中 multi 的应用
- LeetCode 1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target(动态规划)
- HTML加载顺序
- 基于飞桨PaddleClas实现轧钢带表面缺陷分类,top1准确率可达100%
- 01Python的基本的数据结构之List