Superviosr是一个UNIX-like系统上的进程监控工具,是一个Python开发的client/server系统,能够管理和监控unix上面的进程。同daemontools同样,它也不能监控daemon进程。node
官网地址为:http://supervisord.org/python
为啥简单呢?由于我们一般管理linux进程的时候,通常来讲都须要本身编写一个可以实现进程start/stop/restart/reload功能的脚本,而后丢到/etc/init.d/下面。这么作有不少很差的地方,第一咱们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,咱们还要本身写一个监控重启脚本,而supervisor则能够完美的解决这些问题。linux
那supervisor是如何实现进程管理并重启的呢?其实supervisor管理进程,就是经过fork/exec的方式把这些被管理的进程,看成supervisor的子进程来启动。这样的话,咱们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了,这样就省下了本身写控制脚本带来的麻烦。第二,被管理进程做为supervisor的子进程,当子进程挂掉的时候,父进程能够准确获取子进程挂掉的信息的,因此固然也就能够对挂掉的子进程进行自动重启操做,固然重启仍是不重启,还要看你的配置文件里面有木有设置autostart=true。ios
supervisor管理的进程、进程组信息,所有都写在一个ini格式的文件里。并且,咱们管理supervisor的时候的能够在本地进行管理,也能够远程管理,并且supervisor提供了一个web界面,咱们能够在web界面上监控、管理进程。 固然,本地、远程和web管理的时候,须要调用supervisor的xml_rpc接口。nginx
使用supervisor监控子进程,获得的子进程状态无疑是准确的。git
supervisor能够对进程组统一管理,也就是说我们能够把须要管理的进程写到一个组里面,而后咱们把这个组做为一个对象进行管理,如启动、中止、重启等等操做。而linux系统则是没有这种功能的,咱们想要中止一个进程,只能一个一个的去中止,要么就本身写个脚本去批量中止。github
大伙都知道linux的进程,特别是侦听在1024端口之下的进程,通常用户大多数状况下,是不能对其进行控制的。想要控制的话,必需要有root权限。而supervisor提供了一个功能,能够为supervisord或者每一个子进程,设置一个非root的user,这个user就能够管理它对应的进程了。web
supervisor主要由Supervisord、Supervisorctl、Web server和XML-RPC interface组成。npm
为了统一python版本和各类依赖库,推荐使用pyrun代替系统的python进行部署,同时须要在pyrun安装pip,将安装包下载至pkg目录,执行以下命令:windows
/data/pyrun/bin/pip install --no-index -f pkg meld3==1.0.0 /data/pyrun/bin/pip install --no-index -f pkg elementtree==1.2.6-20050316 /data/pyrun/bin/pip install --no-index -f pkg supervisor==3.2.0
若是机器没法联网,也能够源码安装,安装的步骤以下:
setuptools (latest) from http://pypi.python.org/pypi/setuptools. meld3 (latest) from http://www.plope.com/software/meld3/. elementtree (latest) from http://effbot.org/downloads#elementtree.
Windows和Mac下均可以使用包管理工具npm进行安装,打开终端/命令行工具,输入如下代码并执行:
npm install supervisor -g //windows sudo npm install supervisor -g //mac
说明:Mac最好加上sudo授予管理员权限进行安装,避免有的文件因权限问题下载失败致使模块没法使用。
使用supervisor主要会涉及到如下几个命令:
# 启动supervisor python /usr/bin/supervisord # 启动监控的进程 supervisorctl start all # 关闭监控的进程 supervisorctl stop all # 查看状态 supervisorctl status # 从新加载配置文件: supervisorctl reload
具体来讲,进入Node项目根目录,执行命令supervisor yourNodeEntrance(.js)便可启动监听。例如:
除此以外,supervisor 3.0版本还引入了事件,利用这个特性咱们实现实时监控进程状态并告警。
首先了解一下supervisor提供的事件,supervisor经过子进程对应用程序进行管理,监控程序一样做为一个子进程运行,子进程的stdin、stdout、stderr都已经被重定向。事件处理过程以下:
supervisor提供的多种事件类型,包括:进程状态事件、supervisor状态事件、定时事件、xmlrpc调用事件、进程日志事件等等。咱们主要关注进程状态相关事件。supervisor对进程定义了以下状态,每一个状态的切换都会触发相应的事件。
vi /usr/local/etc/supervisord.ini # 将下面注释去掉 [inet_http_server] ; inet (TCP) server disabled by default port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) username=fengjx ; (default is no username (open server)) password=fengjx1989 ; (default is no password (open server)) # 重启服务 $ brew services start supervisor ==> Tapping homebrew/services Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'... remote: Counting objects: 10, done. remote: Compressing objects: 100% (7/7), done. remote: Total 10 (delta 0), reused 6 (delta 0), pack-reused 0 Unpacking objects: 100% (10/10), done. Tapped 0 formulae (37 files, 51KB) ==> Successfully started `supervisor` (label: homebrew.mxcl.supervisor)
supervisord.ini 的最后一行配置:
files = /usr/local/etc/supervisor.d/*.ini
咱们能够吧配置文件写到 /usr/local/etc/supervisor.d/ 目录下,只要以.ini 后缀结尾就行,例如管理nginx的状态:
vi nginx.ini [program:nginx] command = sudo /usr/local/bin/nginx stdout_logfile=/data/home/supervisor/logs/nginx_stdout.log stdout_logfile_maxbytes=10MB stderr_logfile=/data/home/supervisor/logs/nginx_stderr.log stderr_logfile_maxbytes=10MB autostart=true autorestart=true ;environment = PATH="$PATH:/usr/local/bin"
而后,使用 supervisorctl 启动 nginx。
supervisorctl start nginx
参考:
github上2个基于supervisor二次开发的集中进程管理工具,可在一个页面下管理多台机器的进程:
https://github.com/mlazarov/s...
https://github.com/TAKEALOT/n...