## 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服务的关键,有时整个安装或者重设流程混乱了,重启一下。一切都正常了