当前位置: 首页 > Linux

[Linux工具]SupervisorProcessManager

时间:2023-04-06 03:46:59 Linux

概述项目中遇到的一些脚本需要通过后台进程运行,以保证不会被异常打断。除了nohup、&、screen,推荐的方法是使用Supervisor。Supervisor是一套用Python开发的通用进程管理程序。它可以将一个普通的命令行进程变成后台守护进程,监控进程状态,异常退出时自动重启。它使用fork/exec将这些托管进程作为主管的子进程启动。这样只需要在supervisor配置文件中写上要管理的进程的可执行文件的路径即可。也实现了当子进程挂掉的时候,父进程可以准确的获取到子进程挂掉的信息,并且可以选择是否自己启动和报警。Supervisor还提供了一个功能,可以为supervisord或者每个子进程设置一个非root用户,这个用户可以管理它对应的进程。安装1:easy_install安装:easy_installsupervisor2:pip安装:pipinstallsupervisor3:Debian/Ubuntu可以直接apt安装:apt-getinstallsupervisor配置apt-getinstall安装后,supervisor的配置文件在:/etc/supervisor/supervisord.confsupervisor配置文件默认是不完整的,但在大多数默认情况下,上面提到的基本功能已经满足。其管理的子进程配置文件为:/etc/supervisor/conf.d/*.conf通过easy_install或pip安装,配置文件不存在,需要自己导入。运行echo_supervisord_conf以打印出示例配置文件。示例说明请参考supervisor(1)Basics的详细说明。如果将sample设置为配置文件:1:运行echo_supervisord_conf查看配置sample:echo_supervisord_conf2:创建配置文件:echo_supervisord_conf>/etc/supervisord.conf配置subprocess配置文件,可以直接在[program]中设置:theprogramname]在主管中。;[program:theprogramname];这是我们要管理的子进程,“:”后面是名字,最好不要乱写,和实际进程有关系。我们可以设置一个或多个这样的程序。程序是要管理的过程;命令=/bin/猫;py-a'hehe'需要注意的是,我们的命令只能是在终端运行的进程,不能是守护进程。这个想了想就知道了,比如command=servicehttpdstart。httpd进程由linux服务管理,我们supervisor再次启动这个命令,已经不是严格意义上的子进程了。这是必须设置的项目;process_name=%(program_name)s;这是进程名,如果下面的numprocs参数为1,这个参数被忽略,它的默认值%(program_name)s就是上面程序冒号后的名字,但是如果有多个numprocs,那么这个就不行了.想想就知道不可能每个进程都使用同一个进程名。;numprocs=1;要启动的进程数。不为1时,就是进程池的概念。请注意,process_name的设置默认为1。.不需要设置;directory=/tmp;在进程运行之前,在会议之前切换到这个目录。它不是默认设置的。..不需要设置;umask=022;进程掩码,默认为none,不需要;优先级=999;子进程启动和关闭的优先级,优先级最低的先启动,关闭时默认为999。.不需要设置;自动启动=真;如果为true,子进程会在supervisord启动后自动启动。默认为真。.不需要设置;自动重启=意外;这是设置子进程挂掉后自动重启。一共有三个选项,false、unexpected和true。如果为假,则在任何情况下都不会重新启动。如果意外,只有当进程的退出码不是下面exitcodes中定义的退出码时,才会自动重启。为true时,只要子进程挂掉,就会无条件重启;开始秒数=1;这个选项是子进程启动后多少秒,如果此时状态为running,我们认为启动成功。默认值为1。.不需要设置;startretries=3;当进程启动失败时,尝试启动的最大次数。.超过3次后,supervisor会将此进程的状态设置为FAIL,默认值为3。。不需要设置;退出代码=0,2;注意对应上面的autorestart=unexpected。.exitcodes中定义的退出代码是预期的。;停止信号=退出;进程停止信号可以是TERM、HUP、INT、QUIT、KILL、USR1或USR2等,默认为TERM。.当使用set信号终止进程时,退出代码将被认为是预期的。不需要设置;停止等待秒数=10;这是我们向子进程发送stopsignal信号后,等待系统返回信息给supervisord的最长时间。过了这个时间,supervisord就会给子进程发送一个强制kill信号。默认值为10秒。.不需要设置;停止组=假;这个东西主要用于supervisord管理的子进程,这个子进程本身还有子进程。所以如果我们只杀掉supervisord的子进程,那么子进程的子进程就有可能成为孤儿进程。所以我们可以设置一个选项,杀死整个子进程的整个进程组。如果设置为true,一般killasgroup也会设置为true。需要注意的是,该选项发送停止信号,默认为false。.不需要设置。.;killasgroup=false;这与上面的stopasgroup类似,但它发送一个kill信号;user=chrism;如果supervisord是root启动的,我们这里设置这个非root用户,可以用来管理程序。它不是默认设置的。..非必须设置项;redirect_stderr=true;如果为true,stderr日志将写入stdout日志文件,默认为false,不需要;stdout_logfile=/a/路径;子进程的stdout日志路径可以指定Path、AUTO、none等三个选项。如果设置为none,则不会生成任何日志。如果设置为AUTO,会随机找一个地方生成日志文件,当supervisord重启时,之前的日志文件会被清空。当redirect_stderr=true时,sterr也会被写入这个日志文件;stdout_logfile_maxbytes=1MB;日志文件的最大大小与[supervisord]中定义的相同。默认为50;stdout_logfile_backups=10;与[supervisord]定义的相同。默认为10;stdout_capture_maxbytes=1MB;这个东西是设置捕获管道的大小。当该值不为0时,子进程可以从stdout发送信息,supervisor可以根据这些信息发送相应的事件。默认为0,为0时表示关闭管道。..不需要;stdout_events_enabled=false;当设置为true时,当子进程从stdout向文件描述符写入日志时,会触发supervisord发送一个PROCESS_LOG_STDOUT类型的事件。默认为假。..不需要设置;stderr_logfile=/a/路径;这个东西是设置stderr写的log路径,当redirect_stderr=true的时候。这个不用设置,设置了也没用。因为它会被写入到与stdout_logfile相同的文件中。默认为AUTO,即可以存放在任何地方,supervisord重启后会清空。.不需要设置;stderr_logfile_maxbytes=1MB;这个出现过几次,就不重复了;stderr_logfile_backups=10;这也是;stderr_capture_maxbytes=1MB;这与stdout_capture相同。默认为0,关闭;stderr_events_enabled=false;这个是一样的,默认是false;环境=A="1",B="2";this是子进程的环境变量,不与其他子进程共享;serverurl=AUTO;配置参考/etc/supervisor/conf.d/test.conf#项目名[program:blog]#脚本目录directory=/opt/bin#脚本执行命令command=/usr/bin/python/opt/bin/test。py#supervisor启动时是否同时启动,默认为Trueautostart=true#程序退出时,程序不会自动重启,默认为unexpected#设置子进程挂掉后自动重启的情况,一共有三个选项,false、unexpected和true。如果为假,则在任何情况下都不会重新启动。如果是意外的,只有当进程的退出代码没有在下面的exitcodes中定义时。autorestart=false#这个选项是多少秒后子进程启动,这个如果状态是running,我们就认为启动成功。默认值为1startsecs=1#日志输出stderr_logfile=/tmp/blog_stderr.logstdout_logfile=/tmp/blog_stdout.log#脚本运行用户身份user=zhoujy#将stderr重定向到stdout,默认falseredirect_stderr=true#stdout日志文件大小,默认50MBstdout_logfile_maxbytes=20M#stdout日志文件备份stdout_logfile_backups=20[program:easyswoole]directory=/home/wwwroot/easyswoolecommand=phpeasyswoolestartautorestart=truevisstartsecs=1stderr_logfilesys/tmp/supervisord_olesupereaswoole.logstdout_logfile=/tmp_superlog.superlog/eavisor/tmploguser=rootredirect_stderr=truestdout_logfile_maxbytes=20Mstdout_logfile_backups=20#下面两个要加上,不然会报。etc/init.d/supervisorRun:/etc/init.d/supervisorstart2)通过easy_install安装的supervisor运行supervisordrun:#注意要守护的进程不要单独启动,直接执行supervisord即可supervisord-c/etc/supervisord.conf编辑配置后,通过supervisorctlupdateweb界面[inet_http_server]port=0.0.0.0:9002username=userpassword=123子进程管理即可生效#有多少个子进程supervisorctlstatus#easyswoole进程supervisorctlstopeasyswoolesupervisorctlstarteasyswoole#allsupervisorctlstopallsupervisorctlstartall参考Supervisor官方文档