supervisor 维护 golang 进程

代码准备工作

在代码目录执行go build或者go install来生成可执行文件

注意:如果使用go install生成在bin目录下的可执行文件,需要注意代码中的日志目录问题

安装supervisor

官网地址:http://supervisord.org/index.html

1
2
sudo yum install python-setuptools
sudo easy_install supervisor 或者 sudo pip install supervisor

安装成功后,生成配置文件

1
sudo echo_supervisord_conf > /etc/supervisord.conf

添加配置文件

新建一个文件夹专门放置.conf文件

/etc/下新建supervisor_conf_file文件夹,并在该文件加下新建gin_api.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[program:gin_api]
user=root
command=/home/go/src/gin_api/gin_api #go可执行文件路劲
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/root/supervisor_log/gin_api.log #标准输出log,得去相应的目录下新建log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/root/supervisor_log/gin_api_err.log #错误输出log,得去相应的目录下新建log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stopsignal=INT
[supervisord]

说明:

1
2
3
4
5
command:表示运行的命令,我这是填写的我demo安装包的原则路径。
autostart:表示是否跟随supervisor一起启动。
autorestart:如果该程序挂了,是否重新启动。
stdout_logfile:终端标准输出重定向文件。
stderr_logfile:终端错误输出重定向文件。

修改配置文件

编辑 /etc/supervisord.conf,将文件最下面的

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

修改为:

1
2
[include]
files = /etc/supervisor_conf_file/*.conf

启动supervisord

1
sudo /usr/bin/supervisord -c /etc/supervisord.conf

若报如下错误:

1
Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

解决办法:

1
2
find / -name supervisor.sock
unlink /xxx/supervisor.sock

之后再次执行启动命令。

执行命令查看gin_api服务是否启动成功:

1
sudo supervisorctl status

输出:

1
gin_api                          RUNNING   pid 7648, uptime 0:09:57

ps:

1
2
3
4
5
6
7
8
9
10
11
12
[root@accapp /home/go/src/gin_api]# supervisorctl 
gin_api RUNNING pid 7648, uptime 0:02:39
supervisor> help

default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version

supervisor> exit
[root@accapp /home/go/src/gin_api]#

相关命令

  • 停止supervisor(子进程也会被停止)

    1
    supervisorctl shutdown
  • 把 supervisor 相关的进程都杀掉

    1
    kill -9 $(ps -ef|grep supervisor | awk '{print $2}')

解决unix:///tmp/supervisor.sock no such file的问题

原因:tmp目录中的文件被Linux自动清除了

  1. 新建目录和修改权限

    1
    2
    3
    4
    5
    sudo mkdir -p  /var/supervisor_tmp/run
    sudo mkdir -p /var/supervisor_tmp/log

    sudo chmod 777 /var/supervisor_tmp/run
    sudo chmod 777 /var/supervisor_tmp/log
  2. 修改/etc/supervisor.conf配置文件
    把所有的/tmp路径修改掉:
    /tmp/supervisor.sock 改成 /var/supervisor_tmp/run/supervisor.sock
    /tmp/supervisord.log 改成 /var/supervisor_tmp/log/supervisor.log
    /tmp/supervisord.pid 改成 /var/supervisor_tmp/run/supervisor.pid

  3. 重启
    杀掉supervisor进程和子进程,再启动supervisor