程序开发完部署到服务器上,不想谈对象的时候被领导骚扰,不想睡觉被叫醒,还是需要一些程序的守护功能。
下面看几个常用的方式:
nohup
123456789101112
#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)
安装
12345
# 方式一
pip install supervisor
# 方式二
yum install supervisor
配置
1
echo_supervisord_conf > /etc/supervisord.conf
配置文件
1234567891011121314151617181920212223242526272829303132333435
;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
123456789101112131415
;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
常用命令
123456
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
配置文件
123456789
# 文件名称 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
运行
123456789101112131415161718
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 ...
$ supervisord ctl signal all
$ supervisord ctl pid
$ supervisord ctl fg
总结
go版的是轻量级的,特别适合那些有强迫症的玩家,不喜欢太多的安装,python版的用的人更多点。
因为完成的功能比较的单一和简单,所以用哪个看个人爱好了。