supervisor更改某项⽬配置后需要重新启动才有效
在linux服务器上部署了node项⽬,使⽤supervisor进⾏管理,supervisor是个好⼯具,具体介绍见这⾥
梗概了该项⽬对的某些配置后,重新启动项⽬,发现问题仍在,通过⽇志内容才知道原来新的配置没有被应⽤。
要使更新的配置得以应⽤,需要重新启动supervisor服务。具体操作如下:
⼀、原理
supervisor是所有项⽬的⽗进程:
supervisor(pid=29208)会成为主进程,管理各个项⽬的进程。
当项⽬A(pid=11531)挂掉,supervisor根据设置autorestart、startretries是否重启。
若要重启,则会重启项⽬A(pid=13357),
若不重启,则项⽬A(pid=0)。
当supervisor被kill,管理的项⽬全部死掉,重启supervisor(pid=14140),管理的项⽬都重启;
supervisor是如何知道某项⽬挂掉的?
⼦进程异常退出的时候,作为⽗进程肯定是能收到信号的。
1. 简单
为啥简单呢?因为咱们通常管理linux进程的时候,⼀般来说都需要⾃⼰编写⼀个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下⾯。这么做有很多不好的地⽅,第⼀我们要编写这个脚本,这就很耗时耗⼒了。第⼆,当这个进程挂掉的时候,linux不会⾃动重启它的,想要⾃动重启的话,我们还要⾃⼰写⼀个监控重启脚本。⽽,supervisor则可以完美的解决这些问题。
好,怎么解决的呢,其实supervisor管理进程,就是通过fork/exec的⽅式把这些被管理的进程,当作supervisor的⼦进程来启动。这样的话,我们只要在supervisor的配置⽂件中,把要管理的进程的可执⾏⽂件的路径写进去就OK了。这样就省下了我们如同linux管理进程的时候,⾃⼰写控制脚本的⿇烦了。第⼆,被管理进程作为supervisor的⼦进程,当⼦进程挂掉的时候,⽗进程可以准确获取⼦进程挂掉的信息的,所以当然也就可以对挂掉的⼦进程进⾏⾃动重启了,当然重启还是不重启,也要看你的配置⽂件⾥⾯有⽊有设置autostart=true了,这是后话。
2. 精确
为啥说精确呢?因为linux对进程状态的反馈,有时候不太准确。为啥不准确?这个楼主也不知道啊,官⽅⽂档是这么说的,知道的告诉楼主⼀下吧,感激不尽。⽽supervisor监控⼦进程,得到的⼦进程状态⽆疑是准确的。
3. 进程组
supervisor可以对进程组统⼀管理,也就是说咱们可以把需要管理的进程写到⼀个组⾥⾯,然后我们把这个组作为⼀个对象进⾏管理,如启动,停⽌,重启等等操作。⽽linux系统则是没有这种功能的,我们想要停⽌⼀个进程,只能⼀个⼀个的去停⽌,要么就⾃⼰写个脚本去批量停⽌。
4. 集中式管理
supervisor管理的进程,进程组信息,全部都写在⼀个ini格式的⽂件⾥就OK了。⽽且,我们管理supervisor的时候的可以在本地进⾏管理,也可以远程管理,⽽且supervisor提供了⼀个web界⾯,我们可以在web界⾯上监控,管理进程。当然了,本地,远程和web管理的时候,需要调⽤supervisor的xml_rpc接⼝,这个也是后话。
5. 有效性
当supervisor的⼦进程挂掉的时候,操作系统会直接给supervisor发信号。⽽其他的⼀些类似superviso
r的⼯具,则是通过进程的pid⽂件,来发送信号的,然后定期轮询来重启失败的进程。显然supervisor更加⾼效。。。⾄于是哪些类似supervisor⼯具,这个楼主就不太清楚了,楼主还听说过god,director,但是没⽤过。有兴趣的朋友可以玩玩
6. 可扩展性
supervisor是个开源软件,⽜逼点的,可以直接去改软件。不过咱们⼤多数⼈还是⽼⽼实实研究supervisot提供的接⼝吧,supervisor 主要提供了两个可扩展的功能。⼀个是event机制,这个就是楼主这两天⼲的活要⽤到的东西。再⼀个是xml_rpc,supervisor的web管理端和远程调⽤的时候,就要⽤到它了。
7. 权限
⼤伙都知道linux的进程,特别是侦听在1024端⼝之下的进程,⼀般⽤户⼤多数情况下,是不能对其进⾏控制的。想要控制的话,必须
要有root权限。⽽supervisor提供了⼀个功能,可以为supervisord或者每个⼦进程,设置⼀个⾮root的user,这个user就可以管理它对应的进程了。
不过这功能,⽤不⽤就看⼤伙⾃⼰的环境了
8. 还有⼀些什么兼容性,稳定性,感觉⽤处不⼤,就不扯了。
⼆、supervisorctrl操作
1、更新新的配置到supervisord
supervisorctl update
2、重新启动配置中的所有程序
supervisorctl reload
3、启动某个进程(program_name=你配置中写的程序名称)
supervisorctl start program_name
4、查看正在守候的进程
supervisorctl
5、停⽌某⼀进程 (program_name=你配置中写的程序名称)
pervisorctl stop program_name
6、重启某⼀进程 (program_name=你配置中写的程序名称)
supervisorctl restart program_name
7、停⽌全部进程
supervisorctl stop all
三、supervisor主配置⽂件 /etc/f
当个进程配置,/etc/supervisor/conf.d/f:
program:crond]
command=/etc/init.d/crond start
[program:rsyslog]
command=/etc/init.d/rsyslog start
[program:fix-cron]
command=sh /opt/fix-cron.sh
startretries=0
四、supervisor⽇志
⽇志⽬录/etc/f配置,默认配置:logfile=/tmp/supervisord.log,
⽰例:
2018-08-1618:54:02,331 WARN received SIGTERM indicating exit request
2018-08-1618:54:02,331 INFO waiting for sshd, rsyslog to die
2018-08-1618:54:03,332 INFO stopped: rsyslog (terminated by SIGTERM)
2018-08-1618:54:05,334 INFO waiting for sshd to die
2018-08-1618:54:06,337 INFO stopped: sshd (exit status 255)
2018-08-1618:54:06,629 CRIT Supervisor running as root (no user in config file)
2018-08-1618:54:06,629 WARN Included extra file"/etc/supervisor/conf.d/f" during parsing
2018-08-1618:54:06,629 WARN Included extra file"/etc/supervisor/conf.d/f" during parsing
2018-08-1618:54:06,642 INFO RPC interface 'supervisor' initialized
2018-08-1618:54:06,642 CRIT Server 'inet_http_server' running without any HTTP authentication checking
2018-08-1618:54:06,643 INFO RPC interface 'supervisor' initialized
2018-08-1618:54:06,643 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2018-08-1618:54:06,643 INFO supervisord started with pid 1
2018-08-1618:54:07,646 INFO spawned: 'sshd' with pid 7
2018-08-1618:54:07,648 INFO spawned: 'sofa-global' with pid 8
2018-08-1618:54:07,650 INFO spawned: 'fix-cron' with pid 9
2018-08-1618:54:07,652 INFO spawned: 'shellinaboxd' with pid 10
2018-08-1618:54:07,659 INFO spawned: 'rsyslog' with pid 12
2018-08-1618:54:07,661 INFO spawned: 'crond' with pid 13
2018-08-1618:54:07,707 INFO exited: crond (exit status 0; not expected)
2018-08-1618:54:07,718 INFO exited: shellinaboxd (exit status 0; not expected)
2018-08-1618:54:08,017 INFO gave up: shellinaboxd entered FATAL state, too many start retries too quickly
2018-08-1618:54:08,240 INFO exited: sofa-global (exit status 1; not expected)
2018-08-1618:54:09,242 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-08-1618:54:09,243 INFO spawned: 'sofa-global' with pid 70
2018-08-1618:54:09,244 INFO success: fix-cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)exited
2018-08-1618:54:09,244 INFO success: rsyslog entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-08-1618:54:09,245 INFO spawned: 'crond' with pid 71
2018-08-1618:54:09,319 INFO exited: crond (exit status 0; not expected)
2018-08-1618:54:09,357 INFO reaped unknown pid 56
2018-08-1618:54:09,857 INFO exited: sofa-global (exit status 1; not expected)
2018-08-1618:54:10,865 INFO gave up: sofa-global entered FATAL state, too many start retries too quickly
2018-08-1618:54:11,872 INFO spawned: 'crond' with pid 106
2018-08-1618:54:11,942 INFO exited: crond (exit status 0; not expected)
2018-08-1618:54:14,958 INFO spawned: 'crond' with pid 112
2018-08-1618:54:15,039 INFO exited: crond (exit status 0; not expected)
2018-08-1618:54:16,043 INFO gave up: crond entered FATAL state, too many start retries too quickly
2018-08-1618:54:17,860 INFO reaped unknown pid 34
2018-08-1618:54:18,003 INFO exited: fix-cron (exit status 0; expected)
gave up: redis entered FATAL state, too many start retries too quickly
⼀般是因为进程启动太慢造成,在superisor的conf中的[program:xxxx]加⼊启动时间“startsecs=50”,如果还不⾏再加⼤。默认是1秒,重试3次。
⼀般守护进程的做法就是fork⼀个⼦进程,⽗进程马上退出,以致于supervisor⽆法得到⼦进程的ID。
五、问题
supervisor 没有保活程序的原因:
1、command中执⾏的程序是后台进程、或者是⽴刻结束的shell脚本,或者是cron表达式,这些command马上就结束的,supervisor会认为程序已结束,并且重试3次(默认),发现始终起不来,就不再守护进程。supervisorctl命令能看出进程的监控状态,RUNNING是正常的。
2、看配置⽂件⾥⾯有⽊有设置autostart=true

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。