python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程

因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容,Python 进程管理工具 Supervisor 使用教程

Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上。Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k。

什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的程序,比如一个后台任务,我最常用的是用来启动和管理基于 Tornado 写的 Web 程序。

除此之外,Supervisor 还能很友好的管理程序在命令行上输出的日志,可以将日志重定向到自定义的日志文件中,还能按文件大小对日志进行分割。

Supervisor 有两个主要的组成部分:

supervisord,运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。

supervisorctl,是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。

安装

sudo pip install supervisor

创建配置文件

echo_supervisord_conf > /etc/supervisord.conf

如果出现没有权限的问题,可以使用这条命令

sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"

配置文件说明

想要了解怎么配置需要管理的进程,只要打开 supervisord.conf 就可以了,里面有很详细的注释信息。

打开配置文件

vim /etc/supervisord.conf

默认的配置文件是下面这样的,但是这里有个坑需要注意,supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,但是 /tmp 目录是存放临时文件,里面的文件是会被 Linux 系统删除的,一旦这些文件丢失,就无法再通过 supervisorctl 来执行 restart 和 stop 命令了,将只会得到 unix:///tmp/supervisor.sock 不存在的错误 。

[unix_http_server]

;file=/tmp/supervisor.sock ; (the path to the socket file)

;修改为 /var/run 目录,避免被系统删除

file=/var/run/supervisor.sock ; (the path to the socket file)

;chmod=0700 ; socket file mode (default 0700)

;chown=nobody:nogroup ; socket file uid:gid owner

;username=user ; (default is no username (open server))

;password=123 ; (default is no password (open server))

;[inet_http_server] ; inet (TCP) server disabled by default

;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface)

;username=user ; (default is no username (open server))

;password=123 ; (default is no password (open server))

...

[supervisord]

;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)

;修改为 /var/log 目录,避免被系统删除

logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)

logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)

logfile_backups=10 ; (num of main logfile rotation backups;default 10)

loglevel=info ; (log level;default info; others: debug,warn,trace)

;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

;修改为 /var/run 目录,避免被系统删除

pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

...

;设置启动supervisord的用户,一般情况下不要轻易用root用户来启动,除非你真的确定要这么做

;user=chrism ; (default is current user, required if root)

...

[supervisorctl]

; 必须和'unix_http_server'里面的设定匹配

;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket

;修改为 /var/run 目录,避免被系统删除

serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket

;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket

;username=chris ; should be same as http_username if set

;password=123 ; should be same as http_password if set

...

默认情况下,进程的日志文件达到50MB时,将进行分割,最多保留10个文件,当然这些配置也可以对每个进程单独配置。

权限问题

设置好配置文件后,应先创建上述配置文件中新增的文件夹。如果指定了启动用户 user,这里以 oxygen 为例,那么应注意相关文件的权限问题,包括日志文件,否则会出现没有权限的错误。例如设置了启动用户 oxygen,然后启动 supervisord 出现错误

Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)

就是由于上面的配置文件中 /var/run 文件夹,没有授予启动 supervisord 的用户 oxygen 的写权限。/var/run 文件夹实际上是链接到 /run,因此我们修改 /run 的权限。

sudo chmod 777 /run

一般情况下,我们可以用 root 用户启动 supervisord 进程,然后在其所管理的进程中,再具体指定需要以那个用户启动这些进程。

使用浏览器来管理

supervisor 同时提供了通过浏览器来管理进程的方法,只需要注释掉如下几行就可以了。

;[inet_http_server] ; inet (TCP) server disabled by default

;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface)

;username=user ; (default is no username (open server))

;password=123 ; (default is no password (open server))

[supervisorctl]

...

;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket

;username=chris ; should be same as http_username if set

;password=123 ; should be same as http_password if set

343468-20151004155112027-670589086.jpg

使用 include

在配置文件的最后,有一个 [include] 的配置项,跟 Nginx 一样,可以 include 某个文件夹下的所有配置文件,这样我们就可以为每个进程或相关的几个进程的配置单独写成一个文件。

[include]

files = /etc/supervisord.d/*.ini

进程的配置样例

一个简单的例子如下

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名

[program:your_program_name]

command=python server.py --port=9000

;numprocs=1 ; 默认为1

;process_name=%(program_name)s ; 默认为 %(program_name)s,即 [program:x] 中的 x

directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录

user=oxygen ; 使用 oxygen 用户来启动该进程

; 程序崩溃时自动重启,重启次数是有限制的,默认为3次

autorestart=true

redirect_stderr=true ; 重定向输出的日志

stdout_logfile = /var/log/supervisord/tornado_server.log

loglevel=info

设置日志级别

loglevel 指定了日志的级别,用 Python 的 print 语句输出的日志是不会被记录到日志文件中的,需要搭配 Python 的 logging 模块来输出有指定级别的日志。

多个进程

按照官方文档的定义,一个 [program:x] 实际上是表示一组相同特征或同类的进程组,也就是说一个 [program:x] 可以启动多个进程。这组进程的成员是通过 numprocs 和 process_name 这两个参数来确定的,这句话什么意思呢,我们来看这个例子。

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名

[program:foo]

; 可以在 command 这里用 python 表达式传递不同的参数给每个进程

command=python server.py --port=90%(process_num)02d

directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录

; 若 numprocs 不为1,process_name 的表达式中一定要包含 process_num 来区分不同的进程

numprocs=2

process_name=%(program_name)s_%(process_num)02d;

user=oxygen ; 使用 oxygen 用户来启动该进程

autorestart=true ; 程序崩溃时自动重启

redirect_stderr=true ; 重定向输出的日志

stdout_logfile = /var/log/supervisord/tornado_server.log

loglevel=info

上面这个例子会启动两个进程,process_name 分别为 foo:foo_01 和 foo:foo_02。通过这样一种方式,就可以用一个 [program:x] 配置项,来启动一组非常类似的进程。

再介绍两个配置项 stopasgroup 和 killasgroup

; 默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进程的子进程。如果这个配置项为 true,那么也隐含 killasgroup 为 true。例如在 Debug 模式使用 Flask 时,Flask 不会将接收到的 stop 信号也传递给它的子进程,因此就需要设置这个配置项。

stopasgroup=false ; send stop signal to the UNIX process

; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进程的子进程。如果这个程序使用了 python 的 multiprocessing 时,就能自动停止它的子线程。

killasgroup=false ; SIGKILL the UNIX process group (def false)

更详细的配置例子,可以参考如下,官方文档在这里

;[program:theprogramname]

;command=/bin/cat ; the program (relative uses PATH, can take args)

;process_name=%(program_name)s ; process_name expr (default %(program_name)s)

;numprocs=1 ; number of processes copies to start (def 1)

;directory=/tmp ; directory to cwd to before exec (def no cwd)

;umask=022 ; umask for process (default None)

;priority=999 ; the relative start priority (default 999)

;autostart=true ; start at supervisord start (default: true)

;autorestart=unexpected ; whether/when to restart (default: unexpected)

;startsecs=1 ; number of secs prog must stay running (def. 1)

;startretries=3 ; max # of serial start failures (default 3)

;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)

;stopsignal=QUIT ; signal used to kill process (default TERM)

;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)

;stopasgroup=false ; send stop signal to the UNIX process group (default false)

;killasgroup=false ; SIGKILL the UNIX process group (def false)

;user=chrism ; setuid to this UNIX account to run the program

;redirect_stderr=true ; redirect proc stderr to stdout (default false)

;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO

;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)

;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)

;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)

;stdout_events_enabled=false ; emit events on stdout writes (default false)

;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO

;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)

;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10)

;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)

;stderr_events_enabled=false ; emit events on stderr writes (default false)

;environment=A="1",B="2" ; process environment additions (def no adds)

;serverurl=AUTO ; override serverurl computation (childutils)

将多个进程按组管理

Supervisor 同时还提供了另外一种进程组的管理方式,通过这种方式,可以使用 supervisorctl 命令来管理一组进程。跟 [program:x] 的进程组不同的是,这里的进程是一个个的 [program:x] 。

[group:thegroupname]

programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions

priority=999 ; the relative start priority (default 999)

当添加了上述配置后,progname1 和 progname2 的进程名就会变成 thegroupname:progname1 和 thegroupname:progname2 以后就要用这个名字来管理进程了,而不是之前的 progname1。

以后执行 supervisorctl stop thegroupname: 就能同时结束 progname1 和 progname2,执行 supervisorctl stop thegroupname:progname1 就能结束 progname1。supervisorctl 的命令我们稍后介绍。

启动 supervisord

执行 supervisord 命令,将会启动 supervisord 进程,同时我们在配置文件中设置的进程也会相应启动。

# 使用默认的配置文件 /etc/supervisord.conf

supervisord

# 明确指定配置文件

supervisord -c /etc/supervisord.conf

# 使用 user 用户启动 supervisord

supervisord -u user

更多参数请参考文档

supervisorctl 命令介绍

# 停止某一个进程,program_name 为 [program:x] 里的 x

supervisorctl stop program_name

# 启动某个进程

supervisorctl start program_name

# 重启某个进程

supervisorctl restart program_name

# 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)

supervisorctl stop groupworker:

# 结束 groupworker:name1 这个进程 (start,restart 同理)

supervisorctl stop groupworker:name1

# 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件

supervisorctl stop all

# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程

supervisorctl reload

# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

supervisorctl update

注意:显示用 stop 停止掉的进程,用 reload 或者 update 都不会自动重启。也可以参考这里

开机自动启动 Supervisord

Supervisord 默认情况下并没有被安装成服务,它本身也是一个进程。官方已经给出了脚本可以将 Supervisord 安装成服务,可以参考这里查看各种操作系统的安装脚本,但是我用官方这里给的 Ubuntu 脚本却无法运行。

安装方法可以参考 serverfault 上的回答。

比如我是 Ubuntu 系统,可以这么安装,这里选择了另外一个脚本

# 下载脚本

sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord"

# 设置该脚本为可以执行

sudo chmod +x /etc/init.d/supervisord

# 设置为开机自动运行

sudo update-rc.d supervisord defaults

# 试一下,是否工作正常

service supervisord stop

service supervisord start

注意:这个脚本下载下来后,还需检查一下与我们的配置是否相符合,比如默认的配置文件路径,pid 文件路径等,如果存在不同则需要进行一些修改。

其实还有一个简单的方法,因为 Linux 在启动的时候会执行 /etc/rc.local 里面的脚本,所以只要在这里添加执行命令就可以

# 如果是 Ubuntu 添加以下内容

/usr/local/bin/supervisord -c /etc/supervisord.conf

# 如果是 Centos 添加以下内容

/usr/bin/supervisord -c /etc/supervisord.conf

以上内容需要添加在 exit 命令前,而且由于在执行 rc.local 脚本时,PATH 环境变量未全部初始化,因此命令需要使用绝对路径。

在添加前,先在终端测试一下命令是否能正常执行,如果找不到 supervisord,可以用如下命令找到

sudo find / -name supervisord

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ft服务器设置传输协议,ft服务器设置成主动模式

ft服务器设置成主动模式 内容精选换一换如果您选择使用SFS Turbo实现文件共享存储,此章节操作可跳过,您可以参见《SAP HANA用户指南》中的“格式化磁盘”章节,挂载Backup卷。NFS Server磁盘需要格式化,并挂载到相应的目录后&#…

mysql text字段导出_Mysql数据库的各种命令:

一、连接MYSQL格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql -u root -p,回车后提示你输密码. 注意用户名前可以有空格也可以没有空格,…

运行,JUnit! 跑!!!

JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术,甚至没有读过一篇博客文章,更不用说一本书了。 也许这是一件好事,因为它们看起来足够简单且易于理解,因此我们无需任何手册即可立即使用它们,但这也意味着它…

css3图形绘制

以下几个例子主要是运用了css3中border、bordr-radius、transform、伪元素等属性来完成的,我们先了解下它们的基本原理。 border:简单的来说border语法主要包含(border-width、border-style、border-color)三个属性。 „ border-t…

vueh5调用摄像头拍照_潜望式拍照5G手机盘点:售价相差数千元 究竟怎么选?

【dogkeji-科技犬】最近很多网友询问科技犬,目前支持50X潜望式长焦手机都有哪些,可否进行相关手机的推荐,今天就应大家的需求来盘点一下,给各位网友一些参考。推荐一,三星 Galaxy S20 U三星Galaxy S20 5G系列不仅搭载了…

09 事件对象

上篇介绍完我们js的事件流的概念之后,相信大家对事件流也有所了解了。那么接下来我们看一下jquery的事件操作。 在说jquery的每个事件之前,我们先来看一下事件对象 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状…

使用Struts2,Hibernate和MySQL创建个人MusicManager Web应用程序的研讨会

概述: 在本研讨会教程中,我们将使用Struts 2,Hibernate和MySQL数据库开发一个个人音乐管理器应用程序。 该Web应用程序可用于将您的音乐收藏添加到数据库中。 我们将显示用于添加唱片的表格,并在下面显示所有音乐收藏。 通过单击“…

链表快速排序python_Python一行代码实现快速排序的方法

今天将单独为大家介绍一下快速排序! 一、算法介绍 排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中"快速排序"(Quicksort&…

自定义滚动条样式

啥都不说先看图: 注: 只适合chrom,不适用IE和fireFox 下面展示代码: 1 <html lang"en">2 <head>3 <meta charset"UTF-8">4 <title>CSS3自定义滚动条-轩枫阁</title>5 <style>6 header7 {8 font-family: …

rust为什么显示不了国服_Rust编程语言初探

静态、强类型而又不带垃圾收集的编程语言领域内&#xff0c;很久没有新加入者参与竞争了&#xff0c;大概大部分开发者认为传统的C/C的思路已经不太适合新时代的编程需求&#xff0c;即便有Ken Tompson这样的大神参与设计的golang也采用了GC的思路来设计其新一代的语言&#xf…

wps表格粗线和细线区别_详解论文中的表格技术

今天我们主要学习的技能如下&#xff1a;• 怎样用word做论文要求的三线表• 三线表中辅助线的断开• 表格或者图片自动编号1. 先普及一下&#xff0c;论文中的三线表吧。三线表以其形式简洁、功能分明、阅读方便而在科技论文中被推荐使用。三线表通常只有3条线&#xff0c;即顶…

如何自定义CSS滚动条的样式?

欢迎大家前往腾讯云 社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表 本文会介绍CSS滚动条选择器&#xff0c;并在demo中展示如何在Webkit内核浏览器和IE浏览器中&#xff0c;自定义一个横向以及一个纵向的滚动条。 0.需求 有的时候我们不想使用浏览器默…

RabbitMQ基础知识

RabbitMQ基础知识 一、背景RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queue &#xff09;的开源实现。AMQP 的出现其实也是应了广大人民群众的需求&#xff0c;虽然在同步消息通讯的世界里有很多公开标准&#xff08;如 COBAR的 IIOP &#xff0c;或者是 …

iview 级联选择组件_使用 element-ui 级联插件遇到的坑

需求描述【省市区三级联动】组件&#xff1a;Cascader 级联选择器后端需要所选中的地区的名字&#xff0c;如&#xff1a;[北京市, 北京市, 东城区]获取后端省市区具体列表的接口返回数据&#xff1a;// 省 - 参数1 [{value: 1,label: 北京市},... ] // 市 - 参数2 [{value: 1,…

深入理解CPU和异构计算芯片GPU/FPGA/ASIC (上篇)

王玉伟&#xff0c;腾讯TEG架构平台部平台开发中心基础研发组资深工程师&#xff0c;专注于为数据中心提供高效的异构加速云解决方案。目前&#xff0c;FPGA已在腾讯海量图片处理以及检测领域已规模上线。 随着互联网用户的快速增长&#xff0c;数据体量的急剧膨胀&#xff0c;…

jenkins-基础配置

一&#xff0c;配置远程连接服务器 系统管理 --> 系统设置 SSH remote hosts 二&#xff0c;设置docke的URL&#xff08;设置jenkins构建镜像时候所连接的docker url &#xff0c;参考 docker开启远程访问https://www.cnblogs.com/galsnag/articles/10069709.html&#xf…

JSF:直接从页面将参数传递给JSF操作方法,这是JavaEE 6+的一个不错的功能

Java企业版JavaEE 6中提供的JSF 2的一项不错的功能是&#xff0c;您可以将参数传递给任何操作组件&#xff08;例如commandButton或commandLink组件&#xff09;的操作方法。 基于此&#xff0c;您可以最大程度地减少托管bean中的方法数量。 另外&#xff0c;为了最小化在bea…

海洋主题绘画_深圳举办风帆时代海洋绘画作品展,展出作品600余件

12月12日&#xff0c;第七届《风帆时代海洋绘画作品展》在位于蛇口邮轮中心3楼的深圳大学海洋文化科普教育基地举行开幕仪式。该项目得到深圳市宣传文化事业专项基金支持&#xff0c;由深圳大学海洋艺术研究中心主办&#xff0c;深圳市海洋文化艺术研究会承办。作为开幕式重要环…

不要被约束的意思_不要再奢望你会变得自律了丨“他律”比“自律”更重要

高三寒假和同学打赌一个假期做完400套卷子。否则给他1000元。。。然后每天早上六点晚上12点&#xff0c;春节也没过&#xff0c;最后做完了卷子&#xff0c;我也完成了自己的梦想&#xff01;&#xff01;&#xff01;然而上面这个大神不是我&#xff0c;是我引用的一颗真实栗子…

一篇文章为你深度解析HTTPS 协议

一、前言 微信小程序如期发布&#xff0c;开发者在接入微信小程序过程中&#xff0c;会遇到以下问题&#xff1a; 小程序要求必须通过 HTTPS 完成与服务端通信&#xff0c;若开发者选择自行搭建 HTTPS 服务&#xff0c;那需要自行 SSL 证书申请、部署&#xff0c;完成 https …