部署任务上线,一直用nohup肯定是不行的,作为不专业的运维起码要会用一些进程管理工具,这次我用的是Python开发的supervisor【话说给我几个月,我也能开发出来。。。】
这是github的地址:https://github.com/Supervisor/supervisor
这是官方的使用介绍::http://supervisord.org/
下面我写一些自己的简单记录,方便我以后使用,参考链接就不上了,百度出来的,基本比较杂乱。
首先本人是通过pip install supervisor的方式进行安装,非通过yum或apt安装,但具体使用差不多。
装好以后可以使用命令:echo_supervisord_conf如果有一堆配置信息输出,这就正确了。
这个里面有所有的服务器以及任务的相关配置。
插入一下,supervisor有两个可执行的Python文件
/root/anaconda3/bin/supervisord 这个是启动文件
/root/anaconda3/bin/supervisorctl 这个是控制文件
需要通过echo_supervisord_conf的输出,导出到指定的/etc/supervisord.conf下面,其实导出到哪里都可以,这是给supervisord使用的配置文件。
这里务必要注意修改里面的
[include]
files = supervisord.d/*.conf
这个是启动supervisor后,管理子进程配置文件的地方,文件的后缀名随便你,网上有conf或者ini无所谓。
配置文件网上有很多,也可以直接参考echo_supervisord_conf的输出情况。
配置好,就可以通过supervisord -c /etc/supervisord.conf运行改进程。
常用supervisorctl命令
supervisorctl status 查看当期进程状态 supervisorctl stop <name> 停止一个进程 supervisorctl start <name> 启动 supervisorctl restart <name> 重启 supervisorctl reload 重启supervisord主进程
supervisorctl 常用命令
查看任务状态:supervisorctl status
启动任务:supervisorctl start <name>
停止任务:supervisorctl stop <name>
重启任务:supervisorctl restart <name>
清除日志文件:supervisorctl clear <name>
清除多个日志文件:supervisorctl clear <name> <name>
清除所有日志文件:supervisorctl clear all
移除任务:supervisorctl remove <name>
下面是我复制百度上面相关信息,开机自动启动supervisord的操作
在目录/usr/lib/systemd/system/ 新建文件supervisord.service,并添加配置内容
[Unit] Description=Process Monitoring and Control Daemon After=rc-local.service nss-user-lookup.target [Service] Type=forking ExecStart=/usr/bin/supervisord -c /usr/supervisor/supervisord.conf ;开机启动时执行 ExecStop=/usr/bin/supervisord shutdown ; 这里面我都进行了修改 ExecReload=/usr/bin/supervisord reload ; 根据自身情况修改 killMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
启动服务:systemctl enable supervisord
验证是否开机启动:systemctl is-enabled supervisord
配置文件,参考的链接:https://www.cnblogs.com/toutou/p/supervisor.html
3.2 增加一个配置文件,以便supervisor用来监控程序
cat > /usr/supervisor/supervisord.d/supervisor_test_one.conf
在新建的supervisor_test_one.conf文件中添加以下配置
[program:test_one] command=java -jar /data/smallvideo/supervisor/taskApp-exec.jar TaskTestOne ; 被监控的进程路径 priority=1 ; 数字越高,优先级越高 numprocs=1 ; 启动几个进程 autostart=true ; 随着supervisord的启动而启动 autorestart=true ; 自动重启 startretries=10 ; 启动失败时的最多重试次数 exitcodes=0 ; 正常退出代码 stopsignal=KILL ; 用来杀死进程的信号 stopwaitsecs=10 ; 发送SIGKILL前的等待时间 redirect_stderr=true ; 重定向stderr到stdout [program:test_two] command=java -jar /data/smallvideo/supervisor/taskApp-exec.jar TaskTestTwo ; 被监控的进程路径 priority=1 ; 数字越高,优先级越高 numprocs=1 ; 启动几个进程 autostart=true ; 随着supervisord的启动而启动 autorestart=true ; 自动重启 startretries=10 ; 启动失败时的最多重试次数 exitcodes=0 ; 正常退出代码 stopsignal=KILL ; 用来杀死进程的信号 stopwaitsecs=10 ; 发送SIGKILL前的等待时间 redirect_stderr=true ; 重定向stderr到stdout
3.3 supervisor配置文件详解
- command:启动程序使用的命令,可以是绝对路径或者相对路径 - process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s - numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1 - numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值 - priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999 - autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。 - autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。 - startsecs:程序启动后等待多长时间后才认为程序启动成功 - startretries:supervisord尝试启动一个程序时尝试的次数。默认是3 - exitcodes:一个预期的退出返回码,默认是0,2。 - stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。 - stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间 - stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组 - killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。 - user:如果supervisord以root运行,则会使用这个设置用户启动子程序 - redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。 - stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。 - stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true - stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - environment:一个k/v对的list列表 - directory:supervisord在生成子进程的时候会切换到该目录 - umask:设置进程的umask - serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
监控demotest程序示例:
[program:demotest] command=python demotest.py 10000 ; 被监控的进程启动命令 directory=/root/ ; 执行前要不要先cd到目录去,一般不用 priority=1 ;数字越高,优先级越高 numprocs=1 ; 启动几个进程 autostart=true ; 随着supervisord的启动而启动 autorestart=true ; 自动重启。。当然要选上了 startretries=10 ; 启动失败时的最多重试次数 exitcodes=0 ; 正常退出代码(是说退出代码是这个时就不再重启了吗?待确定) stopsignal=KILL ; 用来杀死进程的信号 stopwaitsecs=10 ; 发送SIGKILL前的等待时间 redirect_stderr=true ; 重定向stderr到stdout