Skip to main content

Lost Temple

Ubuntu18.04使用supervisor守护进程

Table of Contents

## 问题背景

最近部署了一个python server在我买的服务器上,想让他一直运行,否则一断开服务器的话,python server提供的API就访问不了了。

于是想着用supervisor来做守护进程, 本文就是记录supervisor 的安装、配置、使用技巧,并设置如何supervisor开机自动启动

## 机器环境

Ubuntu版本:18.04

Ubuntu用户:root

## Ubuntu安装supervisor

apt install supervisor

## Ubuntu配置supervisor

安装完成后,会生成一个默认的配置文件/etc/supervisor/supervisord.conf, 这个默认配置里面也会load所有在conf.d目录下的配置

root@test:/etc/supervisor# tree
.
|-- conf.d
|   `-- we.conf
`-- supervisord.conf

1 directory, 2 files

supervisord.conf这个默认配置会load所有在conf.d目录下的配置,所以我们接下来在conf.d目录下新建一个我们自己的配置

touch /etc/supervisor/conf.d/we.conf

参照默认配置文件supervisord.conf里的内容改改,配置内容如下

[program:we]
directory=/home/test/
command=sh we.sh
autostart=true
autorestart=true
startretries=10
redirect_stderr=true
stdout_logfile=/home/test/out.log

具体也可参照官方给的详细文档: http://supervisord.org/configuration.html

## 检查supervisor的状态

1、检查supervisor的状态

ps aux | grep supervisor

root@test:/etc/supervisor# ps aux | grep supervisor
root      2551  0.0  2.0  65580 21508 ?        Ss   12:39   0:09 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
root      7720  0.0  0.1  13116  1044 pts/0    S+   16:46   0:00 grep --color=auto supervisor

当看到如上对应的进程,就说明supervisor启动是成功的。

2、检查守护的进程的状态

root@test:/etc/supervisor# supervisorctl
we                        RUNNING   pid 2603, uptime 4:05:59

我们就可以看到我们配置的守护进程的状态,如果不在运行,会有相应的错误信息,可以去刚才配置的log目录查看日志:

less /home/test/out.log

## supervisorctl 常用命令

commandDescription
supervisorctl stop program_name停止某个进程
supervisorctl start program_name启动某个进程
supervisorctl restart program_name重启某个进程
supervisorctl stop all停止全部进程
supervisorctl reload载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl update根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

## 设置supervisor开机启动

如果使用apt安装的,一般来说会自动设置好开机启动,但是如果你重启之后发现没有开机自动启动,可以按照下面的方法配置。

把下面的命令写进 rc.local 即可:

/usr/bin/supervisord

## mac设置supervisor

1、brew 安装supervisor

如果你还没有安装brew,这里使他们的官网https://brew.sh/,安装brew的命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install supervisor
brew services restart supervisor

2、配置文件,先打开默认配置文件

vim /usr/local/etc/supervisord.conf

3、这是它的默认配置:

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999)
;autostart=true                ; start at supervisord start (default: true)
;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
;startretries=3                ; max # of serial start failures when starting (default 3)
;autorestart=unexpected        ; when to restart if exited after running (def: unexpected)
;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stdout_syslog=false           ; send stdout to syslog with process name (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;stderr_syslog=false           ; send stderr to syslog with process name (default false)
;environment=A="1",B="2"       ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

4、我们可以复制一份,改一改,改成我们自己想要启动程序的配置,比如我想要启动gos

[program:gitgos]
command=/Users/yzw/Downloads/gitzub/gogs/gogs web -p 3008              ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)
directory=/Users/yzw/Downloads/gitzub/gogs/                ; directory to cwd to before exec (def no cwd)
autostart=true                ; start at supervisord start (default: true)
startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
startretries=3                ; max # of serial start failures when starting (default 3)
; stopasgroup=true             ; send stop signal to the UNIX process group (default false)
; killasgroup=true             ; SIGKILL the UNIX process group (def false)
user=zhiwei                   ; setuid to this UNIX account to run the program
redirect_stderr=true          ; redirect proc stderr to stdout (default false)
stdout_logfile=/Users/zhiwei/Downloads/gitzub/gogs/log/data.log        ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=10MB   ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
stdout_capture_maxbytes=10MB   ; number of bytes in 'capturemode' (default 0)
stderr_logfile=/Users/zhiwei/Downloads/gitzub/gogs/log/error.log       ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=10MB   ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
stderr_capture_maxbytes=10MB   ; number of bytes in 'capturemode' (default 0)

5、然后再执行命令重新加载下配置,使得新的配置生效, 然后再执行supervisorctl命令,查看gos是否启动成功,状态为RUNNING则成功启动。

supervisorctl reload
➜ supervisorctl
gitgos                           RUNNING   pid 44926, uptime 0:41:54
supervisor>