程序开发完部署到服务器上,不想谈对象的时候被领导骚扰,不想睡觉被叫醒,还是需要一些程序的守护功能。

下面看几个常用的方式:

nohup

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#0 – stdin (standard input,标准输入) 
#1 – stdout (standard output,标准输出)
#2 – stderr (standard error,标准错误输出) 
#2>&1解释:
#将标准错误(2)重定向到标准输出(&1),
#标准输出(&1)再被重定向输入到myout.file文件中

nohup command > myout.file 2>&1 &

#如果不想看日志文件可以这么写
nohup command > /dev/null 2>&1 &

crontab

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

使用格式

1
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

参数说明:

  • -u user:用来设定某个用户的crontab服务;
  • file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

详细介绍请看官方:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html

supervisor(Python)

安装

1
2
3
4
5
# 方式一
pip install supervisor

# 方式二
yum install supervisor

配置

1
echo_supervisord_conf > /etc/supervisord.conf

配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
;supervisord.conf

[unix_http_server]
file=/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ; socket 文件的 mode,默认是 0700
;chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid

;[inet_http_server] ; HTTP 服务器,提供 web 管理界面
;port=127.0.0.1:9001 ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
;username=user ; 登录管理后台的用户名
;password=123 ; 登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ; 日志文件大小,超出会 rotate,默认 50MB
logfile_backups=10 ; 日志文件保留备份数量默认 10
loglevel=info ; 日志级别,默认 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 文件
nodaemon=false ; 是否在前台启动,默认是 false,即以 daemon 的方式启动
minfds=1024 ; 可以打开的文件描述符的最小值,默认 1024
minprocs=200 ; 可以打开的进程数的最小值,默认 200

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord

; 包含其他的配置文件
[include]
files = /etc/supervisor/*.conf ; 可以是 *.conf 或 *.ini

程序配置

1
vi /etc/supervisor/demo_server.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
;demo_server.conf

[program:demo_server] ;程序名
directory = /root/demo_server ; 程序的启动目录
command = python app.py  ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = root          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 100MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 10     ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /root/demo_server/app.log

运行

1
supervisord -c /etc/supervisord.conf

常用命令

1
2
3
4
5
6
supervisorctl status        //查看所有进程的状态
supervisorctl stop redis    //停止redis
supervisorctl start redi    //启动redis
supervisorctl restart       //重启redis
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序

详细介绍请看官方:http://supervisord.org/

supervisord(golang)

supervisor的python版的是许多人用来管理进程的强大工具。大家也都很喜欢的工具。

但是此工具需要我们安装python环境。在某些情况下,例如在docker环境中,python对我们来说太大了。

在该项目中,使用go-lang重新实现了supervisor。编译的supervisor非常适合未安装python的这些环境。

开源地址:https://github.com/ochinchina/supervisord

安装

源代码安装

必要条件:go语言安装,go 1.11+

如果本地运行的话:直接 go build,如果源代码放到服务器编译,也可以直接运行go build

如果是在开发的电脑上编译源代码,需要执行交叉编译的指令,也很简单:

1
env GOOS=linux GOARCH=amd64 go build -o supervisord

配置文件

1
2
3
4
5
6
7
8
9
# 文件名称 supervisor.conf
# 这个是一个web页面
#[inet_http_server]
#port=127.0.0.1:9001

# 案例
[program:demo]
command = /opt/demo.a -c /opt/demo.conf
stdout_logfile=/data/logs/demo.log

运行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
supervisord -c supervisor.conf -d

# 一些常用的命令
supervisord ctl status
$ supervisord ctl status program-1 program-2...
$ supervisord ctl status group:*
$ supervisord ctl stop program-1 program-2...
$ supervisord ctl stop group:*
$ supervisord ctl stop all
$ supervisord ctl start program-1 program-2...
$ supervisord ctl start group:*
$ supervisord ctl start all
$ supervisord ctl shutdown
$ supervisord ctl reload
$ supervisord ctl signal <signal_name> <process_name> <process_name> ...
$ supervisord ctl signal all
$ supervisord ctl pid <process_name>
$ supervisord ctl fg <process_name>

总结

go版的是轻量级的,特别适合那些有强迫症的玩家,不喜欢太多的安装,python版的用的人更多点。

因为完成的功能比较的单一和简单,所以用哪个看个人爱好了。