关于supervisor:解决supervisor不能监控程序子进程问题

先说一下遇到的问题,应用的是beanstalk队列,有两个tube, 应用 supervisor 监控 beanstalk 生产队列(主过程A),主过程A产生两个子过程(子过程B,子过程C),每个子过程解决一个tube的数据。 supervisor配置如下: [program:queue-worker]command=/usr/local/bin/php /var/www/html/ctc/console.php queue workeruser=www-dataautostart=trueautorestart=trueredirect_stderr=truestartretries=30startsecs=10解决生产队列的代码如下: /** * 启动生产队列 * * @command php console.php queue worker */public function wokerAction(){ echo "------ worker start ------" . PHP_EOL; $beanstalk = $this->getBeanstalk(); $logger = $this->getLogger('queue'); $beanstalk->addWorker( 'main', function (BeanstalkJob $job) use ($config, $logger) { $taskId = $job->getBody(); try { $manager = new MainQueue(); $manager->handle($taskId); } catch (\Throwable $e) { $logger->error("tube:main, task:{$taskId} exception " . kg_json_encode([ 'file' => $e->getFile(), 'line' => $e->getLine(), 'message' => $e->getMessage(), ])); } exit(0); } ); $beanstalk->addWorker( 'notice', function (BeanstalkJob $job) use ($config, $logger) { $taskId = $job->getBody(); try { $manager = new NoticeQueue(); $manager->handle($taskId); } catch (\Throwable $e) { $logger->error("tube:notice, task:{$taskId} exception " . kg_json_encode([ 'file' => $e->getFile(), 'line' => $e->getLine(), 'message' => $e->getMessage(), ])); } exit(0); } ); $beanstalk->doWork();}常常会呈现上面的报错,子过程B或者C就退出了,然而主过程没事。 ...

July 4, 2023 · 2 min · jiezi

关于supervisor:supervisor-指定-python-版本

pkg_resources.DistributionNotFound: The 'supervisor==3.4.0' distribution was not found and is required by the application有时零碎装置了 python3 和 python2,且 python3 为默认版本,装置启动 supervisor 时就报错了。 yum install supervisor编辑以下3个文件,将结尾的 python 解释器门路指定为 2 版本的即可。 vim /usr/bin/echo_supervisord_confvim /usr/bin/supervisorctlvim /usr/bin/supervisord启动 systemctl start supervisord.service

April 17, 2022 · 1 min · jiezi

关于supervisor:supervisor-遇到的两个问题

问题1 refused connection问题景象$ supervisorctl -c /root/ppe-detection/supervisord.confunix:///root/supervisor.sock refused connection起因剖析supervisor 次要蕴含2个组件(理论还有别的): supervisord主过程,负责管理过程的server,它会依据配置文件创立指定数量的应用程序的子过程,治理子过程的整个生命周期,对crash的过程重启,对过程变动发送事件告诉等。supervisorctl客户端的命令行工具,提供一个相似shell的操作接口每次应用 supervisorctl,须要先保障supervisord失常运行。 解决办法# 1. 须要把之前开启的对于supervisor的都kill掉,先查看supervisor(自身也是基于python的)和其运行的python过程$ ps aux | grep python# kill能够上面这条指令,把supervisor和其运行的python过程全杀了$ ps -ef | grep python | grep -v grep | awk '{print $2}' | xargs kill -9# 2. 从新开启supervisord$ sudo supervisord -c supervisord.conf# 3. 如果没有报错,则能够应用supervisorctl了$ supervisorctl问题2 unlinking stale socket问题景象$ sudo supervisord -c supervisord.confUnlinking stale socket /{some_dir}/supervisor.sock问题剖析它说正在解除连贯旧socket,那么帮它间接解除就好了。 问题解决$ sudo supervisord -c supervisord.confUnlinking stale socket /{some_dir}/supervisor.sock# 应用unlink指令,把下面这个supervisor.sock的门路复制下来$ unlilnk /{some_dir}/supervisor.sock# 而后就能够失常应用了$ sudo supervisord -c supervisord.conf$ supervisorctlreferencesupervisor原理及如何应用linux下3种高效Kill掉所有python过程的办法(包含编写运行脚本 .sh) ...

August 19, 2021 · 1 min · jiezi

关于supervisor:Linux-centos-安装-supervisor-管理-Laravel-队列

装置supervisor yum install supervisor装置后通常会在/etc/目录下生成一个supervisord.conf文件和supervisord.d目录,配置文件通常都是放在这个目录下的 关上/etc/supervisord.conf文件,最初一行会有 [include]files = supervisord.d/*.ini了解为加载supervisord.d文件夹下的所有.ini文件 那我配置就写在这里 创立laravel-worker.ini文件,内容如下,具体参数依据你的理论状况来更改 [program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /data/www/YouProjectDirectory/artisan queue:work --sleep=3 --tries=3autostart=trueautorestart=trueuser=apachenumprocs=8redirect_stderr=truestdout_logfile=/data/www/YouProjectDirectory/storage/logs/worker.log上述配置中numprocs 指令让 Supervisor 运行 8 个 queue:work 过程并监督它们,如果失败的话主动重启,当然,你须要批改 queue:work sqs 的 command 指令来映射你的队列连贯 当创立配置文件后,须要刷新 Supervisor 的配置信息并应用如下命令启动过程: sudo supervisordsudo supervisorctl rereadsudo supervisorctl updatesudo supervisorctl start laravel-worker:*如果启动时报laravel-worker: added process group谬误,大概率是你引入配置文件这块出错了,查看下你的.ini配置文件地位对不对,通常间接丢在supervisord.d目录中就能够,前提你没更改过supervisord.conf文件中include file的地位 开机启动服务systemctl enable supervisord验证一下是否为开机启动systemctl is-enabled supervisord2021.06.10 上海南京西路

June 10, 2021 · 1 min · jiezi

关于supervisor:Supervisor-开始

Supervisor 是 Linux/Unix 操作系统上的过程管理工具。本文介绍了于 Ubuntu 18 上如何应用 Supervisor 开机启动、保活守护本人的服务过程。 装置倡议零碎形式装置,可开机启动。 sudo apt install supervisor -ySystemd 查看服务状态: $ sudo systemctl status supervisor● supervisor.service - Supervisor process control system for UNIX Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2021-06-08 18:00:00 CST; 4min 0s ago Docs: http://supervisord.org Main PID: 26297 (supervisord) Tasks: 1 (limit: 4915) CGroup: /system.slice/supervisor.service └─26297 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf6月 08 18:00:00 john-ubuntu18 systemd[1]: Started Supervisor process control system for UNIX.6月 08 18:00:00 john-ubuntu18 supervisord[26297]: 2021-06-08 18:00:00,422 CRIT Supervisor running as root (no user in config file)6月 08 18:00:00 john-ubuntu18 supervisord[26297]: 2021-06-08 18:00:00,422 WARN No file matches via include "/etc/supervisor/conf.d/*.conf"6月 08 18:00:00 john-ubuntu18 supervisord[26297]: 2021-06-08 18:00:00,428 INFO RPC interface 'supervisor' initialized6月 08 18:00:00 john-ubuntu18 supervisord[26297]: 2021-06-08 18:00:00,428 CRIT Server 'unix_http_server' running without any HTTP authentication checki6月 08 18:00:00 john-ubuntu18 supervisord[26297]: 2021-06-08 18:00:00,428 INFO supervisord started with pid 26297Loaded: 配置门路; 开机启动状态Active: 活动状态Main PID: 主过程 IDTasks: 工作数量CGroup: 子过程树Systemd 的服务配置: ...

June 8, 2021 · 6 min · jiezi

关于supervisor:正确离线安装supervisor

正确离线装置supervisorsupervisor简介supervisor是一个用python语言编写的过程管理工具,它能够很不便的监听、启动、进行、重启一个或多个过程。当一个过程意外被杀死,supervisor监听到过程死后,能够很不便的让过程主动复原,不再须要程序员或系统管理员本人编写代码来管制。 supervisor 会波及三个重要的命令supervisord能够了解成supervisor的服务端 运行supervisor时会启动一个过程supervisord,它负责启动所治理的过程,并将所治理的过程作为本人的子过程来启动,而且能够在所治理的过程呈现解体时主动重启 supervisorctl能够了解成supervisor的客户端 supervisorctl是命令行管理工具,能够用如下命令来进行子过程的治理,如: echo_supervisord_conf用来生成默认的配置文件,个别生成默认文件为 supervisor.conf supervisor装置的后期筹备(全副应用压缩包的形式) supervisor是用python写的运行在linux下的过程管理工具,装置supervisor的时候依赖 python的一些包,它依赖:python、setuptools、meld3 1、python装置能够参考此处装置python:https://www.cnblogs.com/winte... 下载python链接:https://www.python.org/ftp/py... 下载相应的压缩包,如:wget https://www.python.org/ftp/py... tar -xvf Python-3.6.8.tgz2、setuptools装置https://pypi.python.org/pypi/...下载压缩包,用tar解压压缩包,装置,如 tar -zxvf setuptools-0.6c11.tar.gz cd setuptools-0.6c11 python setup.py install3、meld3装置https://pypi.python.org/pypi/... wget https://pypi.python.org/packa... tar -zxvf meld3-1.0.2.tar.gz cd meld3-1.0.2 python setup.py install4、supervisor装置tar -zxvf supervisor-3.3.1.tar.gz cd supervisor-3.3.1 python setup.py install此处 supervisor装置后会生成咱们关怀的如下几个可执行程序: supervisord 门路supervisord: /usr/local/bin/supervisordsupervisorctl 门路supervisorctl: /usr/local/bin/supervisorctlecho_supervisord_conf 门路echo_supervisord_conf: /usr/local/bin/echo_supervisord_conf 验证supervisor是否装置胜利 supervisorctl --help supervisor配置创立必要目录和文件创立 /etc/supervisor 目录mkdir /etc/supervisorecho_supervisord_conf 生成supervisord.confecho_supervisord_conf > /etc/supervisor/supervisord.conf批改/etc/supervisor/supervisord.conf文件内容 将unix_http_server 下的 file 门路改掉,如下:[unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) ...

April 3, 2021 · 2 min · jiezi

pip方式安装supervisor

因为yum 没有源,所以用pip的安装方式。 安装supervisor pip install supervisor安装后的执行文件会默认安装在pip的执行文件目录,我的pip目录在/soft/python3.6/bin/,所以supervisor也安装在这个目录。进入这个目录,会看到新生成的三个文件, 执行命令,生成配置文件 ./echo_supervisord_conf > supervisored.conf设置配置文件 mkdir -p /etc/supervisor/conf.dcp supervisored.conf /etc/supervisor/修改配置文件 [include]files = conf.d/*.conf以后的进程配置文件都要放在这个文件夹 创建socket空文件 vim /tmp/supervisor.sock:wq启动supervisor ./supervisord -c /etc/supervisor/supervisored.conf打开交互客户端 ./supervisorctl -c /etc/supervisor/supervisored.conf

June 27, 2019 · 1 min · jiezi

配置-Supervisor自动重启常驻进程

问题:PHP 常驻进程经常出现死掉的情况;解决方案:使用 Supervisor, 当进程死掉时,可以重启,不局限于PHP进程,任何进程,都可以用Supervisor 进行重启。 1、安装 安装python应该就可以了,python 安装包自带 Supervisor或者用pip安装Supervisor进程管理工具参考链接:https://www.cnblogs.com/Dicky-Zhang/p/6171954.html2、配置 2.1 生成配置文件在Mac下,由于安全规则,默认不能在/etc/下增加配置,不过可以在/usr/local/etc目录下创建配置文档,效果是一样的。sudo echo_supervisord_conf > /usr/local/etc/supervisord.conf可以使用上述命令,生成配置文件。其中,echo_supervisord_conf命令可以打印所有的默认配置信息;2.2 配置后台管理页面,解开下面的注释就可以了[inet_http_server]port=127.0.0.1:9001 username=userpassword=1232.3 配置进程重新启动时的命令,在配置文件中,新增下面几行代码[program:apple]process_name=%(program_name)s_%(process_num)02dcommand=php artisan appleautostart=trueautorestart=true;user=usernumprocs=8redirect_stderr=truestdout_logfile=/var/log/supervisor.log3、启动supervisor的守护进程 sudo supervisord -c /usr/local/etc/supervisord.conf其中,需要用 -c 参数指定配置文件。4、管理常驻进程 supervisor守护启动成功后,要自动重启的命令就已经正常运行了。通过本地浏览器,进入管理后台:http://127.0.0.1:9001/,打开效果图如下可以在后台看到进程的相关信息,如运行了多长时间也可以,做相关操作,如停止进程、重启进程、查看log、清除log

June 12, 2019 · 1 min · jiezi

Linux工具篇supervisor进程管理器

概述项目中遇到有些脚本需要通过后台进程运行,保证不被异常中断,除了通过nohup、&、screen以外,更推荐的方法就是用Supervisor。 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。 安装1:easy_install 安装:easy_install supervisor2:pip 安装:pip install supervisor3:Debian / Ubuntu可以直接通过apt安装:apt-get install supervisor配置通过apt-get install安装后,supervisor的配置文件在:/etc/supervisor/supervisord.conf  supervisor的配置文件默认是不全的,不过在大部分默认的情况下,上面说的基本功能已经满足。而其管理的子进程配置文件在: /etc/supervisor/conf.d/*.conf通过easy_install或者pip安装的,配置文件不存在,需要自己导入。运行echo_supervisord_conf打印出一个配置文件的样本,样本说明可以看supervisor(一)基础篇的详细说明,要是设置样本为一个配置文件则: 1:运行 echo_supervisord_conf,查看配置样本:echo_supervisord_conf2:创建配置文件:echo_supervisord_conf > /etc/supervisord.conf配置子进程配置文件,可以直接在supervisor中的[program:theprogramname]里设置。 ;[program:theprogramname] ;这个就是咱们要管理的子进程了,":"后面的是名字,最好别乱写和实际进程 有点关联最好。这样的program我们可以设置一个或多个,一个program就是 要被管理的一个进程;command=/bin/cat ; 这个就是我们的要启动进程的命令路径了,可以带参数 例子:/home/test.py -a 'hehe' 有一点需要注意的是,我们的command只能是那种在终端运行的进程,不能是 守护进程。这个想想也知道了,比如说command=service httpd start。 httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令 这已经不是严格意义的子进程了。 这个是个必须设置的项;process_name=%(program_name)s ; 这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数 了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字, 但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个 进程都用同一个进程名吧。 ;numprocs=1 ; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置 默认为1 。。非必须设置;directory=/tmp ; 进程运行前,会前切换到这个目录 默认不设置。。。非必须设置;umask=022 ; 进程掩码,默认none,非必须;priority=999 ; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭 默认值为999 。。非必须设置;autostart=true ; 如果是true的话,子进程将在supervisord启动后被自动启动 默认就是true 。。非必须设置;autorestart=unexpected ; 这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected 和true。如果为false的时候,无论什么情况下,都不会被重新启动, 如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退 出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无 条件的重启;startsecs=1 ; 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启 动成功了 默认值为1 。。非必须设置;startretries=3 ; 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把 此进程的状态置为FAIL 默认值为3 。。非必须设置;exitcodes=0,2 ; 注意和上面的的autorestart=unexpected对应。。exitcodes里面的定义的 退出码是expected的。;stopsignal=QUIT ; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号 默认为TERM 。。当用设定的信号去干掉进程,退出码会被认为是expected 非必须设置;stopwaitsecs=10 ; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息 给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该 子进程发送一个强制kill的信号。 默认为10秒。。非必须设置;stopasgroup=false ; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有 子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程 有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的 整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。 需要注意的是,该选项发送的是stop信号 默认为false。。非必须设置。。;killasgroup=false ; 这个和上面的stopasgroup类似,不过发送的是kill信号;user=chrism ; 如果supervisord是root启动,我们在这里设置这个非root用户,可以用来 管理该program 默认不设置。。。非必须设置项;redirect_stderr=true ; 如果为true,则stderr的日志会被写入stdout日志文件中 默认为false,非必须设置;stdout_logfile=/a/path ; 子进程的stdout的日志路径,可以指定路径,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 ; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout 发送信息,而supervisor可以根据信息,发送相应的event。 默认为0,为0的时候表达关闭管道。。。非必须项;stdout_events_enabled=false ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将 触发supervisord发送PROCESS_LOG_STDOUT类型的event 默认为false。。。非必须设置;stderr_logfile=/a/path ; 这个东西是设置stderr写的日志路径,当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;environment=A="1",B="2" ; 这个是该子进程的环境变量,和别的子进程是不共享的;serverurl=AUTO ; 配置参考/etc/supervisor/conf.d/test.conf# 项目名[program:blog]# 脚本目录directory=/opt/bin#脚本执行命令command=/usr/bin/python /opt/bin/test.py#supervisor启动的时候是否随着同时启动,默认Trueautostart=true#当程序exit的时候,这个program不会自动重启,默认unexpected#设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的autorestart=false#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1startsecs=1#日志输出 stderr_logfile=/tmp/blog_stderr.log stdout_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=php easyswoole startautorestart=truestartsecs=1stderr_logfile=/tmp/supervisord_easyswoole.log stdout_logfile=/tmp/supervisord_easyswoole.log user = root redirect_stderr = truestdout_logfile_maxbytes = 20Mstdout_logfile_backups = 20# 以下两个要加,否则会报.ini file does not include supervisord section[supervisord][supervisorctl]使用运行1)apt-get install 安装的supervisor直接可以通过 /etc/init.d/supervisor 运行: ...

June 9, 2019 · 2 min · jiezi

喵星在线Flask博客上线布署过程

原文:http://www.catonlinepy.tech/声明:原创不易,未经许可,不得转载 这篇文章,猫姐将讨论如何将flask程序部署到ubuntu服务器上。其中,部署过程涉及到Flask,Nginx,Gunicorn,Supervisor的安装使用。通过学习今天的文章,你将学会部署自己开发的Flask web程序,真正让自己开发的应用上线运行。 0. Flask Web应用处理请求的过程 1. 安装相应的依赖环境使用ssh username@ip 进入云主机的shell环境,并在云主机上安装需要依赖环境,使用如下命令安装: sudo apt-get install nginx supervisor python-pip python3-venvssh的使用方法:ssh命令,加上@前面是云主机服务器的用户名,@后面是云主机服务器的ip地址。 2. 创建虚拟环境如果云主机中没有创建虚拟环境,那么我们有必要创建一个。虚拟开发环境的主要作用是为了将web项目所用的各种库与操作系统自带的python库隔离开来,这样做的好处是开发环境与系统环境隔离,环境之间不会相互影响,特别是对于多人协作的大型项目开发,建立虚拟环境是非常有必要的。下面开始创建虚拟环境: # 使用下面命令,创建一个虚拟开发环境$ python3 -m venv <虚拟环境的名字># 激活刚才建立的虚拟开发环境,(这里我们创建一个名为miao_venv的虚拟环境)$ python3 -m venv miao_venv$ source maio_venv/bin/activate# 安装flask web程序所需要的python包$ pip installl -r requirement.txt激活虚拟环境后,进入run.py文件的目录,在终端中输入python run.py,就可以将程序运行起来了。但是,这样生产环境中将flask程序运行起来是不安装的,并且处理用户请求的能力也非常不足。所以,我们应该去使用gunicorn这个工具去运行我们的Flask web程序。 3. 设置GunicornGunicorn(“Green Unicorn”)是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,自动管理多个worker进程,高性能等多个特点。 采用如下命令安装gunicorn: pip install gunicorngunicorn运行Flask web程序的方法也非常简单,如下命令即可达到目的: gunicorn filename(run):变量名(app) -b localhost:端口号 &# 解释:filename指的是能够将flask程序运行起来的python文件,如run.py的文件名run。冒号后面的是flask实例化的app变量。端口号是在网页中输入的url的端口号查看端口服务是否生效,可以使用下面的命令: # 在命令行中输入:$ ps aux|grep gunicorn# 下面是效果(miao_venv) root@vultr:~/flaskblog# ps aux|grep gunicornroot 4124 0.0 0.0 11020 980 pts/0 S+ 10:35 0:00 grep --color=auto gunicornroot 11117 0.0 2.1 33308 21400 ? S May28 0:10 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006root 11120 0.0 7.6 160528 77160 ? S May28 0:17 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006这样就能够使用gunicorn进程去监听5006的端口。现在gunicorn进程是工作在后台的,但只有一个gunicorn进程会处理web请求,当用户访问量过大时,网站的并发处理能力非常弱。最理想的方法是,使用supervisor工具去启动并监控多个gunicorn进程。 ...

June 8, 2019 · 1 min · jiezi

supervisor-管理进程

supervisor 管理进程说明Supervisor是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程. 安装 pip install supervisor配置cho_supervisord_conf > /etc/supervisord.confsupervisord.conf[unix_http_server]file=/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用[supervisord]logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.loglogfile_maxbytes=50MB ; 日志文件大小,超出会 rotate,默认 50MBlogfile_backups=10 ; 日志文件保留备份数量默认 10loglevel=info ; 日志级别,默认 info,其它: debug,warn,tracepidfile=/tmp/supervisord.pid ; pid 文件nodaemon=false ; 是否在前台启动,默认是 false,即以 daemon 的方式启动minfds=1024 ; 可以打开的文件描述符的最小值,默认 1024minprocs=200 ; 可以打开的进程数的最小值,默认 200[rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl]serverurl=unix:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致[include]files = relative/directory/*.ini ; 可以是 *.conf 或 *.iniprogram 配置[program:appname]directory = /myproject ; 程序的启动目录command = gunicorn -w 8 -b 0.0.0.0:9090 manage:app ; 启动命令autostart = true ; 在 supervisord 启动的时候也自动启动startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了autorestart = true ; 程序异常退出后自动重启startretries = 3 ; 启动失败自动重试次数,默认是 3user = www ; 用哪个用户启动redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 falsestdout_logfile_maxbytes = 50MB ; stdout 日志文件大小,默认 50MBstdout_logfile_backups = 20 ; stdout 日志文件备份数stdout_logfile = /var/log/appname.log其中 [program:appname] 中的 appname 是应用程序的唯一标识,不能重复。对该程序的所有操作(start, restart 等)都通过名字来实现。 几个注意点: 1.执行命令必须是绝对路径的命令 2.执行程序必须是前台运行,如果是后台运行的转为前台 3.如果涉及子进程添加以下参数,确保子进程都能停止 ...

May 16, 2019 · 1 min · jiezi

supervisorctl常用指令

查看帮助help help <action> 关闭supervisordshutdown 重载配置文件并重启supervisord和programreload 读取当前运行配置和program配置文件的差异reread 重载配置文件并重启受影响的programupdate 重启program(不会重载配置文件)restart <name> restart <name> <name> restart all 清空program日志clear <name> clear <name> <name> clear all 前台显示program(Ctrl+C退出)fg <name> 显示supervisord或program IDpid pid <name> pid all 启动programstart <name> start <name> <name> start all 停止programstop <name> stop <name> <name> stop all 查看program状态status <name> status <name> <name> status 输出program最新日志(默认stdout,Ctrl+C退出)tail [-f] <name> [stdout|stderr] (default stdout) 输出supervisord最新日志(Ctrl+C退出)maintail [-f]

April 22, 2019 · 1 min · jiezi

使用Supervisor管理进程

首发于 樊浩柏科学院Supervisor 是一款使用 Python 开发的非常优秀的进程管理工具。它可以在类 UNIX 系统上让用户精确地监视与控制多组指定数量的服务进程。当监控的服务进程意外退出时,会尝试自动重启这些服务,以保持服务可用状态。安装Supervisor 官方 提供的安装方式较多,这里采用 pip 方式安装。安装pip$ yum install python-pip# 升级pip$ pip install –upgrade pip$ pip -Vpip 9.0.1安装Supervisor通过 pip 安装 Supervisor:$ pip install supervisorSuccessfully installed supervisor-3.3.3安装 Supervisor 后,会出现 supervisorctl 和 supervisord 两个程序,其中 supervisorctl 为服务监控终端,而 supervisord 才是所有监控服务的大脑。查看 supervisord 是否安装成功:$ supervisord -v3.3.3开机启动将 supervisord 配置成开机启动服务,下载官方 init 脚本。修改关键路径配置:PIDFILE=/var/run/supervisord.pidLOCKFILE=/var/lock/subsys/supervisordOPTIONS="-c /etc/supervisord.conf"移到该文件到/etc/init.d目录下,并重命名为 supervisor,添加可执行权限:$ chmod 777 /etc/init.d/supervisor配置成开机启动服务:$ chkconfig –add supervisor$ chkconfig supervisor on$ chkconfig –list | grep “supervisor"supervisor 0:off 1:off 2:on 3:on 4:on 5:on 6:off配置生成配置文件Supervisord 安装后,需要使用如下命令生成配置文件。$ mkdir /etc/supervisor$ echo_supervisord_conf > /etc/supervisor/supervisord.conf主配置部分supervisord.conf的主配置部分说明:[unix_http_server]file=/tmp/supervisor.sock ; socket文件的路径;chmod=0700 ; socket文件权限;chown=nobody:nogroup ; socket文件用户和用户组;username=user ; 连接时认证的用户名;password=123 ; 连接时认证的密码[inet_http_server] ; 监听TCPport=127.0.0.1:9001 ; 监听ip和端口username=user ; 连接时认证的用户名password=123 ; 连接时认证的密码[supervisord]logfile=/var/log/supervisord.log ; log目录logfile_maxbytes=50MB ; log文件最大空间logfile_backups=10 ; log文件保持的数量loglevel=info ; log级别pidfile=/var/run/supervisord.pidnodaemon=false ; 是否非守护进程态运行minfds=1024 ; 系统空闲的最少文件描述符minprocs=200 ; 可用的最小进程描述符;umask=022 ; 进程创建文件的掩码;identifier=supervisor ; supervisord标识符;directory=/tmp ; 启动前切换到的目录;nocleanup=true ; 启动前是否清除子进程的日志文件;childlogdir=/tmp ; AUTO模式,子进程日志路径;environment=KEY=“value” ; 设置环境变量[rpcinterface:supervisor] ; XML_RPC配置supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl]serverurl=unix:///tmp/supervisor.sock ; 连接的socket路径;username=chris ; 用户名;password=123 ; 密码prompt=mysupervisor ; 输入用户名和密码时的提示符;history_file=~/.sc_history ; 历史操作记录存储路径[include] ; 包含文件,将每个进程配置为一个文件并包含files = /etc/supervisor/.ini ; 多个进程的配置文件这部分我们不需要做太多的配置修改,如果需要开启 WEB 终端监控,则需要配置并开启 inet_http_server 项。进程配置部分Supervisor 需管理的进程服务配置,示例如下:[program:work] ; 服务名,例如workcommand=php -r “sleep(10);exit(1);” ; 带有参数的可执行命令process_name=%(process_num)s ; 进程名,当numprocs>1时,需包含%(process_num)snumprocs=2 ; 启动进程的数目数;directory=/tmp ; 运行前切换到该目录;umask=022 ; 进程掩码;priority=999 ; 子进程启动关闭优先级autostart=true ; 子进程是否被自动启动startsecs=1 ; 成功启动几秒后则认为成功启动;startretries=3 ; 子进程启动失败后,最大尝试启动的次数autorestart=unexpected ; 子进程意外退出后自动重启的选项,false, unexpected, true。unexpected表示不在exitcodes列表时重启exitcodes=0,2 ; 期待的子程序退出码;stopsignal=QUIT ; 进程停止信号,可以为TERM,HUP,INT,QUIT,KILL,USR1,or USR2等信号,默认为TERM;stopwaitsecs=10 ; 发送停止信号后等待的最大时间;stopasgroup=false ; 是否向子进程组发送停止信号;killasgroup=false ; 是否向子进程组发送kill信号;redirect_stderr=true ; 是否重定向日志到标准输出stdout_logfile=/data/logs/work.log ; 进程的stdout的日志路径;stdout_logfile_maxbytes=1MB ; 日志文件最大大小;stdout_logfile_backups=10;stdout_capture_maxbytes=1MB;stderr_logfile=/a/path ; stderr的日志路径;stderr_logfile_maxbytes=1MB;stderr_logfile_backups=10;stderr_capture_maxbytes=1MB;environment=A=“1”,B=“2” ; 子进程的环境变量;serverurl=AUTO ; 子进程的环境变量SUPERVISOR_SERVER_URL 通常将每个进程的配置信息配置成独立文件,并通过 include 模块包含,这样方便修改和管理配置文件。启动配置完成后,启动 supervisord 守护服务:$ supervisord -c /etc/supervisor/supervisord.conf常用的命令参数说明:-c:指定配置文件路径-n:是否非守护态运行-l:日志文件目录-i:唯一标识查看 supervisord 启动情况:$ ps -ef | grep “supervisor"root 24901 1 0 Sep23 ? 00:00:30 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf$ netstat -tunpltcp 0 0 127.0.0.1:9001 0.0.0.0: LISTEN 24901/python监控进程Supervisor 提供了多种监控服务的方式,包括 supervisorctl 命令行终端、Web 端、XML_RPC 接口多种方式。命令终端直接使用 supervisorctl 即可在命令行终端查看所有服务的情况,如下:$ supervisorctl work:0 RUNNING pid 31313, uptime 0:00:07work:1 RUNNING pid 31318, uptime 0:00:06# -u 用户名 -p 密码supervisorctl 常用命令列表如下;status:查看服务状态update:重新加载配置文件restart:重新启动服务stop:停止服务pid:查看某服务的 pidtail:输出最新的 log 信息shutdown:关闭 supervisord 服务Web在配置中开启 inet_http_server 后,即可通过 Web 界面便捷地监控进程服务了。 ...

March 25, 2019 · 2 min · jiezi

Dockerfile构建PHP开发镜像:Alpine+Nginx+PHP7+Supervisor+Crontab+Laravel

一、配置目录结构1.1 crontabs# do daily/weekly/monthly maintenance# min hour day month weekday command# * * * * * /usr/bin/php /usr/share/nginx/html/artisan schedule:run >> /dev/null 2>&1Tips:一般在生产环境都是负载均衡,定时任务是单独在一个容器执行,故此是注释掉的,需要单独在定时任务容器中打开即可。2.1 nginx与php配置文件Tips:由于php配置文件是监听的sock,默认情况下监听端口 9000。PHP-FPM使用Unix套接字,这避免了TCP的开销。3.1 php二、Dockerfile详解#1.Base ImageFROM alpine# ensure www-data user exists#RUN set -x # && addgroup -g 82 -S www-data # && adduser -u 82 -D -S -G www-data www-data# EnvironmentsENV TIMEZONE Asia/ShanghaiENV PHP_MEMORY_LIMIT 512MENV MAX_UPLOAD 50MENV PHP_MAX_FILE_UPLOAD 200ENV PHP_MAX_POST 100MENV COMPOSER_ALLOW_SUPERUSER 1#2.ADD-PHP-FPM# Mirror mirror switch to Alpine Linux - http://dl-4.alpinelinux.org/alpine/RUN apk update \ && apk upgrade \ && apk add \ curl \ tzdata \ php7-fpm\ php7 \ php7-dev \ php7-apcu \ php7-bcmath \ php7-xmlwriter \ php7-ctype \ php7-curl \ php7-exif \ php7-iconv \ php7-intl \ php7-json \ php7-mbstring\ php7-opcache \ php7-openssl \ php7-pcntl \ php7-pdo \ php7-mysqlnd \ php7-mysqli \ php7-pdo_mysql \ php7-pdo_pgsql \ php7-phar \ php7-posix \ php7-session \ php7-xml \ php7-simplexml \ php7-mcrypt \ php7-xsl \ php7-zip \ php7-zlib \ php7-dom \ php7-redis\ php7-tokenizer \ php7-gd \ php7-mongodb\ php7-fileinfo \ php7-zmq \ php7-memcached \ php7-xmlreader \ && cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ && echo “${TIMEZONE}” > /etc/timezone \ && apk del tzdata \ && rm -rf /var/cache/apk/# https://github.com/docker-library/php/issues/240# https://gist.github.com/guillemcanal/be3db96d3caa315b4e2b8259cab7d07e# https://forum.alpinelinux.org/forum/installation/php-iconv-issueRUN mkdir -p /usr/local/var/log/php7/RUN mkdir -p /usr/local/var/run/COPY ./php/php-fpm.conf /etc/php7/COPY ./php/www.conf /etc/php7/php-fpm.d/RUN apk add –no-cache –repository http://dl-3.alpinelinux.org/alpine/edge/testing gnu-libiconvENV LD_PRELOAD /usr/lib/preloadable_libiconv.so phpRUN rm -rf /var/cache/apk/# Set environmentsRUN sed -i “s|;date.timezone =.|date.timezone = ${TIMEZONE}|i” /etc/php7/php.ini && \ sed -i “s|;memory_limit =.|memory_limit = ${PHP_MEMORY_LIMIT}|i” /etc/php7/php.ini && \ sed -i “s|;upload_max_filesize =.|upload_max_filesize = ${MAX_UPLOAD}|i” /etc/php7/php.ini && \ sed -i “s|;max_file_uploads =.|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|i” /etc/php7/php.ini && \ sed -i “s|;post_max_size =.|post_max_size = ${PHP_MAX_POST}|i” /etc/php7/php.ini && \ sed -i “s|;cgi.fix_pathinfo=.|cgi.fix_pathinfo= 0|i” /etc/php7/php.ini#3.Install-ComposerRUN curl -sS https://getcomposer.org/installer | \ php – –install-dir=/usr/bin/ –filename=composer#4.ADD-NGINXRUN apk add nginxCOPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/COPY ./nginx/nginx.conf /etc/nginx/COPY ./nginx/cert/ /etc/nginx/cert/RUN mkdir -p /usr/share/nginx/html/public/COPY ./php/index.php /usr/share/nginx/html/public/#RUN mkdir -p /run/nginx#RUN touch /run/nginx/nginx.pid# Expose volumesVOLUME ["/usr/share/nginx/html", “/usr/local/var/log/php7”, “/var/run/"]WORKDIR /usr/share/nginx/html#5.ADD-SUPERVISORRUN apk add supervisor \ && rm -rf /var/cache/apk/*# Define mountable directories.VOLUME ["/etc/supervisor/conf.d”, “/var/log/supervisor/"]COPY ./supervisor/conf.d/ /etc/supervisor/conf.d/#6.ADD-CRONTABSCOPY ./crontabs/default /var/spool/cron/crontabs/RUN cat /var/spool/cron/crontabs/default >> /var/spool/cron/crontabs/rootRUN mkdir -p /var/log/cron \ && touch /var/log/cron/cron.logVOLUME /var/log/cron#8.添加启动脚本# Define working directory.WORKDIR /usr/share/nginx/htmlCOPY ./entrypoint.sh /usr/share/nginx/html/RUN chmod +x /usr/share/nginx/html/entrypoint.sh#CMD [“supervisord”, “–nodaemon”, “–configuration”, “/etc/supervisor/conf.d/supervisord.conf”]ENTRYPOINT [”./entrypoint.sh"]传送门:Dockerfile、Docker-Compose基本命令与介绍三、镜像制作与启动3.1 根据Dockerfile制作镜像3.2 查看制作的镜像3.3 启动镜像3.4 浏览器查看是否成功四、镜像发布4.1 镜像发布一定要登录4.2 自动构建当关联的github代码发生改变是,自动触发构建。GitHub地址:https://github.com/tcyfree/anpscDocker Hub镜像地址:https://cloud.docker.com/repo… ...

March 7, 2019 · 2 min · jiezi

Golang项目部署

文章来源:https://goframe.org/deploymen…一、独立部署使用GF开发的应用程序可以独立地部署到服务器上,设置为后台守护进程运行即可。这种模式常用在简单的API服务项目中。服务器我们推荐使用*nix服务器系列(包括:Linux, MacOS, BSD),以下使用Ubuntu系统为例,介绍如何部署使用GF框架开发的项目。1. nohup我们可以使用简单的nohup命令来运行应用程序,使其作为后台守护进程运行,即使远程连接的SSH断开也不会影响程序的执行。在流行的Linux发行版中往往都默认安装好了nohup命令工具。命令如下:nohup ./gf-app &2. tmuxtmux是一款Linux下的终端复用工具,可以开启不同的终端窗口来将应用程序作为后台守护进程执行,即使远程连接的SSH断开也不会影响程序的执行。在ubuntu系统下直接使用sudo apt-get install tmux安装即可。使用以下步骤将应用程序后台运行。tmux new -s gf-app;在新终端窗口中执行./gf-app即可;使用crt + B & D快捷键可以退出当前终端窗口;使用tmux attach -t gf-app可进入到之前的终端窗口;3. supervisorsupervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。官方网站:http://supervisord.org/常见配置如下:[program:gf-app]user=rootcommand=/var/www/mainstdout_logfile=/var/log/gf-app-stdout.logstderr_logfile=/var/log/gf-app-stderr.logautostart=trueautorestart=true使用步骤如下:使用sudo service supervisor start启动supervisor服务;创建应用配置文件/etc/supervisor/conf.d/gf-app.conf, 内容如上;使用sudo supervisorctl进入supervisor管理终端;使用reload重新读取配置文件并重启当前supoervisor管理的所有进程;也可以使用update重新加载配置(默认不重启),随后使用start gf-app启动指定的应用程序;随后可以使用status指令查看当前supervisor管理的进程状态;二、代理部署代理部署即前置一层第三方的WebServer服务器处理所有的请求,将部分请求(往往是动态处理请求)有选择性地转交给后端的Golang应用程序执行,后端部署的Golang应用程序可以配置有多个。这种模式常用在复杂的WebServer配置中,常见的场景例如:需要静态文件分离、需要配置多个域名及证书、需要自建负载均衡层,等等。虽然Golang实现的WebServer也能够处理静态文件,但是相比较于专业性的WebServer如nginx/apache来说比较简单,性能也较弱。因此不推荐使用Golang WebServer作为前端服务直接处理静态文件请求。Nginx我们推荐使用Nginx作为反向代理的前端接入层,有两种配置方式实现动静态请求的拆分。静态文件后缀这种方式通过文件名后缀区分,将指定的静态文件转交给nginx处理,其他的请求转交给golang应用。配置示例如下:server { listen 80; server_name goframe.org; access_log /var/log/gf-app-access.log; error_log /var/log/gf-app-error.log; location ~ ..(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ { access_log off; expires 1d; root /var/www/gf-app/public; try_files $uri @backend; } location / { try_files $uri @backend; } location @backend { proxy_pass http://127.0.0.1:8199; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}其中,8199为本地的golang应用WebServer监听端口。例如,在该配置下,我们可以通过http://goframe.org/my.png访问到指定的静态文件。静态文件目录这种方式通过文件目录区分,将指定目录的访问请求转交给nginx处理,其他的请求转交给golang应用。配置示例如下:server { listen 80; server_name goframe.org; access_log /var/log/gf-app-access.log; error_log /var/log/gf-app-error.log; location ^~ /public { access_log off; expires 1d; root /var/www/gf-app; try_files $uri @backend; } location / { try_files $uri @backend; } location @backend { proxy_pass http://127.0.0.1:8199; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}其中,8199为本地的golang应用WebServer监听端口。例如,在该配置下,我们可以通过http://goframe.org/piblic/my.png访问静态文件。三、容器部署容器部署即使用docker化部署golang应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。1. 编译程序跨平台交叉编译是golang的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常方便地解决了运行依赖问题。使用以下方式静态编译Linux平台amd64架构的可执行文件:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gf-app main.go这样便编译出来一个gf-app的可执行文件。2. 编译镜像我们需要将该可执行文件gf-app编译生成docker镜像,以便于分发及部署。Golang的运行环境推荐使用alpine基础系统镜像,编译出的容器镜像约为20MB左右。一个参考的Dockerfile文件如下( 可以参考gf-home项目的Dcokerfile: https://github.com/gogf/gf-home ):FROM loads/alpine:3.8LABEL maintainer=“john@johng.cn”################################################################################ INSTALLATION###############################################################################ADD ./gf-app /bin/mainRUN chmod +x /bin/main################################################################################ START###############################################################################CMD main其中,我们的基础镜像使用了loads/alpine:3.8这个镜像,基础镜像的Dockerfile地址:https://github.com/johngcn/do… ,仓库地址:https://hub.docker.com/u/loads随后使用 docker build gf-app . 命令编译生成名为gf-app的docker镜像。3. 运行镜像使用以下命令运行镜像:docker run gf-app4. 镜像分发容器的分发可以使用docker官方的平台:https://hub.docker.com/ ,国内也可以考虑使用阿里云:https://www.aliyun.com/produc… 。5. 容器编排在企业级生产环境中,docker容器往往需要结合kubernetes或者docker swarm容器编排工具一起使用。容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:https://kubernetes.io/https://docs.docker.com/swarm/ ...

February 19, 2019 · 1 min · jiezi

Mac环境下使用supervisor

supervisorSuperviosr是一个UNIX-like系统上的进程监控工具,是一个Python开发的client/server系统,可以管理和监控unix上面的进程。同daemontools一样,它也不能监控daemon进程。官网地址为:http://supervisord.org/supervisor特点1,部署简单为啥简单呢?因为咱们通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下面。这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本,而supervisor则可以完美的解决这些问题。那supervisor是如何实现进程管理并重启的呢?其实supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,我们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了,这样就省下了自己写控制脚本带来的麻烦。第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以当然也就可以对挂掉的子进程进行自动重启操作,当然重启还是不重启,还要看你的配置文件里面有木有设置autostart=true。supervisor管理的进程、进程组信息,全部都写在一个ini格式的文件里。而且,我们管理supervisor的时候的可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控、管理进程。 当然,本地、远程和web管理的时候,需要调用supervisor的xml_rpc接口。2,精准使用supervisor监控子进程,得到的子进程状态无疑是准确的。3,进程组supervisor可以对进程组统一管理,也就是说咱们可以把需要管理的进程写到一个组里面,然后我们把这个组作为一个对象进行管理,如启动、停止、重启等等操作。而linux系统则是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。大伙都知道linux的进程,特别是侦听在1024端口之下的进程,一般用户大多数情况下,是不能对其进行控制的。想要控制的话,必须要有root权限。而supervisor提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程了。supervisor结构supervisor主要由Supervisord、Supervisorctl、Web server和XML-RPC interface组成。Supervisord:主进程,负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时通过内置web server和XML-RPC Interface可以轻松实现进程管理。Supervisorctl:管理client,用户通过命令行发送消息给supervisord,可以查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操作等。Web server:superviosr提供了web server功能,可通过web控制进程。XML-RPC interface: XML-RPC接口,提供XML-RPC服务来对子进程进行管理和监控。安装部署为了统一python版本和各种依赖库,推荐使用pyrun代替系统的python进行部署,同时需要在pyrun安装pip,将安装包下载至pkg目录,执行如下命令:/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如果机器无法联网,也可以源码安装,安装的步骤如下:依赖 python,可将python版本升级;需要第三方包 meld3、setuptools、ElementTree;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.root解压相关包,批量安装。安装Windows和Mac下都可以使用包管理工具npm进行安装,打开终端/命令行工具,输入以下代码并执行:npm install supervisor -g //windowssudo npm install supervisor -g //mac说明:Mac最好加上sudo授予管理员权限进行安装,避免有的文件因权限问题下载失败导致模块无法使用。使用使用supervisor主要会涉及到以下几个命令:# 启动supervisorpython /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都已经被重定向。事件处理过程如下:作为监听程序的子进程向stdout写入READYn;事件发生时,supervisor会选择一个处于Ready状态的子进程的stdin写入事件内容;该子进程事件处理完毕后向stdout写入OKn或FAILn,反馈处理结果;重复上述操作supervisor提供的多种事件类型,包括:进程状态事件、supervisor状态事件、定时事件、xmlrpc调用事件、进程日志事件等等。我们主要关注进程状态相关事件。supervisor对进程定义了如下状态,每个状态的切换都会触发相应的事件。开启 web 管理vi /usr/local/etc/supervisord.ini# 将下面注释去掉[inet_http_server] ; inet (TCP) server disabled by defaultport=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/servicesCloning 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 0Unpacking 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/nginxstdout_logfile=/data/home/supervisor/logs/nginx_stdout.logstdout_logfile_maxbytes=10MBstderr_logfile=/data/home/supervisor/logs/nginx_stderr.logstderr_logfile_maxbytes=10MBautostart=trueautorestart=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… ...

January 3, 2019 · 1 min · jiezi

centos下 安装supervisor

1、安装supervisor执行以下命令yum install python-setuptoolseasy_install supervisor或者#如果easy_install不好使就从官方下载:wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz#然后通过python安装:tar zxf supervisor-3.3.1.tar.gzcd supervisorpython setup.py install2、配置Supervisora.创建文件夹和配置文件mkdir /etc/supervisorecho_supervisord_conf > /etc/supervisor/supervisord.confb.修改/etc/supervisor/supervisord.conf文件内容在文件结尾[include]节点处把;files = relative/directory/.ini改为files = conf.d/.confc.执行supervisorctl reload命令使配置文件生效。d.在/etc/supervisor/下创建conf.d文件夹,及ProjectName.conf(以项目名称命名的)e.打开laravel.conf文件,添加内容如下:[program:laravel]process_name=%(program_name)s_%(process_num)02dcommand=php /data/wwwroot/laravel/artisan queue:listen –tries=3autostart=trueautorestart=trueuser=wwwnumprocs=2redirect_stderr=truestdout_logfile=/data/wwwlogs/worker.log3、运行supervisord,查看是否生效,执行以下命令:#运行supervisord -c /etc/supervisor/supervisord.conf#查看进程 (ps -ef | grep ProjectName)ps -ef|grep laravel4、配置supervisord开机启动a.在指定目录下创建文件supervisord.servicevim /usr/lib/systemd/system/supervisord.serviceb.输入以下内容:[Unit]Description=Supervisor daemon[Service]Type=forkingExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.confExecStop=/usr/bin/supervisorctl shutdownExecReload=/usr/bin/supervisorctl reloadKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.targetc.执行以下命令:systemctl enable supervisordd.验证是否为开机启动:#提示 enabled 表示成功systemctl is-enabled supervisord5、常用命令service supervisord start #启动service supervisord stop #停止service supervisord status #状态supervisorctl shutdown #关闭所有任务supervisorctl stop|start program_name #启动或停止服务supervisorctl status #查看所有任务状态

December 13, 2018 · 1 min · jiezi