supervisord进程管理
## supervisord安装和使用
[TOC]
### 1 安装和启动
```yaml
yum install supervisord
yum install -y supervisor
systemctl enable supervisord
```
### 2 启动进程
```yaml
supervisord -c supervisord.conf
```
### 3 启动所有
```yaml
supervisorctl -c supervisord.conf status all
## 编辑supervisord.conf
```yaml
vim /etc/supervisord.conf
```
```yaml
[unix_http_server]
file=/data/block/supervisor/logs/supervisor.sock
[supervisord]
logfile=/data/block/supervisor/logs/supervisor.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/data/block/supervisor/logs/supervisor.pid
nodaemon=false
minfds=1024
minprocs=200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:////data/block/supervisor/logs/supervisor.sock
[program:block-eth-test]
command=/data/block/eth/bin/geth --syncmode "fast" --identity "internal-tx" --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --port "30303" --rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --cache "4096" --maxpeers "60" --rinkeby --rpc.allow-unprotected-txs --datadir "/data/block/eth/data"
directory=/data/block/eth
autostart=false
autorestart=unexpected
stderr_logfile=/data/block/eth/logs/eth-block-stderr.log
stdout_logfile=/data/block/eth/logs/eth-block-stdout.log
#把 stderr 重定向到 stdout
redirect_stderr = false
#stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
#stdout 日志文件备份数
stdout_logfile_backups = 20
#[program:block-btc-test]
#command=/data/block/btc/bin/bitcoind -datadir=/data/block/btc/data -conf=/data/block/btc/config/bitcoin.conf
#directory=/data/block/btc
#autostart=false
#autorestart=unexpected
#stderr_logfile=/data/block/btc/logs/btc-block-stderr.log
#stdout_logfile=/data/block/btc/logs/btc-block-stdout.log
#把 stderr 重定向到 stdout
#redirect_stderr = false
#stdout 日志文件大小,默认 50MB
#stdout_logfile_maxbytes = 50MB
#stdout 日志文件备份数
#stdout_logfile_backups = 20
[program:block-ltc-test]
command=/data/block/ltc/bin/litecoind -datadir=/data/block/ltc/data -conf=/data/block/ltc/config/litecoin.conf
directory=/data/block/ltc
autostart=false
autorestart=unexpected
stderr_logfile=/data/block/ltc/logs/ltc-block-stderr.log
stdout_logfile=/data/block/ltc/logs/ltc-block-stdout.log
#把 stderr 重定向到 stdout
redirect_stderr = false
#stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
#stdout 日志文件备份数
stdout_logfile_backups = 20
[program:block-bch-test]
command=/data/block/bch/bin/bitcoind -datadir=/data/block/bch/data -conf=/data/block/bch/config/bch.conf
directory=/data/block/bch
autostart=false
autorestart=unexpected
stderr_logfile=/data/block/bch/logs/bch-block-stderr.log
stdout_logfile=/data/block/bch/logs/bch-block-stdout.log
#把 stderr 重定向到 stdout
redirect_stderr = false
#stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
#stdout 日志文件备份数
stdout_logfile_backups = 20
[program:block-btc-test]
command=/data/block/btc/bin/bitcoind -datadir=/data/block/btc/data -conf=/data/block/btc/config/bitcoin.conf
directory=/data/block/btc
autostart=false
autorestart=unexpected
stderr_logfile=/data/block/btc/logs/btc-block-stderr.log
stdout_logfile=/data/block/btc/logs/btc-block-stdout.log
#把 stderr 重定向到 stdout
redirect_stderr = false
#stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
#stdout 日志文件备份数
stdout_logfile_backups = 20
[program:block-omni-test]
command=/data/block/omnicore/bin/omnicored -datadir=/data/block/omnicore/data -conf=/data/block/omnicore/config/omnicoin.conf
directory=/data/block/omnicore
autostart=false
autorestart=unexpected
stderr_logfile=/data/block/omnicore/logs/omnicore-block-stderr.log
stdout_logfile=/data/block/omnicore/logs/omnicore-block-stdout.log
#把 stderr 重定向到 stdout
redirect_stderr = false
#stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
#stdout 日志文件备份数
stdout_logfile_backups = 20
## 先说正常安装的情况下
[TOC]
### 1.安装
```yaml
yum install supervisor
```
### 2.指定配置
```yaml
mkdir /etc/supervisor
```
新建指定目录,为了避免默认配置会在某些更新覆盖掉
```yaml
echo_supervisord_conf > /etc/supervisor/supervisord.conf
```
这里是在新建好的目录新建conf文件,这里关键。默认文件会建立在/etc目录下
### 3.配置文件修改
配置文件,主要变更如下
```yaml
[inet_http_server] ; inet (TCP) server disabled by default
port=*:9001 ; (ip_address:port specifier, *:port for all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
配置最下面
[include]
files = conf.d/*.conf
当然,这里没指定路径,可以直接把配置放下面
里面的conf文件可以随意添加多个。
举例,其中一个cfwebapp.conf文件,内容如下
[program:Cf.FileApp]
command=dotnet Cf.FileApp.dll ; 运行程序的命令
directory=/www/wwwroot/Cf.FileApp/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/AnuoApc.err.log ; 错误日志文件
stdout_logfile=/var/log/AnuoApc.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT
```
### 4.配置服务文件
/usr/lib/systemd/system/下,新建supervisord.service文件。
这里关键,是supervisord文件,建过了supervisor.service文件,配的是supervisord文件,结果导致其实2个不同的启动文件,结果后面造成了设置的混乱。
文件内容如下:
```yaml
# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
5.开机启动
supervisorctl start all
systemctl enable supervisord
设置启动supervisor
验证是否开机启动:
systemctl is-enabled supervisord
```
如果没意外情况,这样启动已经可以配置和启动完毕
### 6.遇到的坑
但是,通常不同服务器,甚至同一个centos镜像(centos版本一样)出来的应用实例
安装还是会遇到不同的问题。
解决办法第一先冷静,centos工具,通常某些配置配错了,打错了等等,导致整个配置跟着错,可以按一下步骤重复继续进行。
如果报错没正常显示
#### 6.1 如果路径指错了或者要变更,
```yaml
supervisorctl reload
```
#### 6.2 当然,reload等于把supervisor服务重新加载。效果是如果有部分服务已经删除了,reload会去掉不存在的服务,再
```yaml
supervisorctl restart all
```
就会看到挂载的服务先停止了,再全部启动了。
#### 6.3 如上面都出现错误信息,可以接着
```yaml
systemctl daemon-reload
```
把整个启动模版都重载一下,这样重载后,
#### 6.4 重新指定
```yaml
echo_supervisord_conf > /etc/supervisor/supervisord.conf
```
#### 6.5 等于重复步骤2,直到
```yaml
supervisorctl reload
提示success
```
#### 6.6 服务启动后可以用
```yaml
systemctl status supervisord.service
```
查看这个服务的状态
```yaml
● supervisord.service - Supervisor daemon
Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2019-06-09 22:16:19 CST; 26s ago
Main PID: 2678 (supervisord)
Tasks: 17
Memory: 142.3M
CGroup: /system.slice/supervisord.service
├─2678 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
└─3095 dotnet Cf.FileApp.dll
```
一般`active绿色为已激活状态`,服务正常运行,服务所启动的进程如下
/etc/supervisor/supervisord.conf
为服务用到的配置文件。
#### 6.7 解决unix:///tmp/supervisor.sock no such file的问题
这个问题发生在配置更改或者指定服务路径等匹配不了的时候,默认tmp会存储supervisor一些缓存日志和加锁的文件,而tmp是临时目录,会特定时候触发清理或者丢失,在这样情况下,就会报`no such file`了。所以把这2种文件指定到非临时目录
#### 6.8、打开配置文件
```yaml
vim /etc/supervisor/supervisord.conf
```
这里把所有的/tmp路径改掉,/tmp/supervisor.sock 改成 /var/run/supervisor.sock,/tmp/supervisord.log 改成 /var/log/supervisor.log,/tmp/supervisord.pid 改成 /var/run/supervisor.pid 要不容易被linux自动清掉
#### 6.9、修改权限
```yaml
sudo chmod 777 /run
sudo chmod 777 /var/log
```
如果没改,启动报错 IOError: [Errno 13] Permission denied: '/var/log/supervisord.log'
#### 6.10、创建supervisor.sock
```yaml
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
```
#### 6.11、启动supervisord,注意stop之前的实例或杀死进程
```yaml
ps ax | grep supervisord
```
supervisord
#### 6.12然后重复reload,restart等之前的步骤
最后,如果还运行不了,需重启reboot一下服务器。服务器reboot不是必须,是验证和重新加载supervisord.service服务的关键,有时整个安装或者重设流程混乱了,重启一下。一切都正常了
- 感谢你赐予我前进的力量