现在假设一个脚本是,hello.py,内容是

fo = open('xx.txt','w')

while 1:

fo.write('hello world')

print('hi')

time.sleep(1)

如果使用python hello.py那么控制台一直print hi,会干不了其它活,必须再xshell开个窗口。如果 ctrl +c ,那程序直接结束了。

使它在后台工作可以结尾加个 &,但这样把xshell窗口关了,就结束了,可以看看记事本有没有新增就证明这个了。这时候还会在前面加个nohup,所以全部命令是 nohup python hello.py &,这样才行。

nohup会记录程序的log日志,普通的print不会去记录,如果不重定向日志输出,默认是当前文件夹下面生成了一个nohup.out,这个随时间越来越大,往一个大文件里面读写东西势必会慢,而且可能搞满磁盘,查了下需要一段shell脚本来搞这个,很麻烦。

还有我要结束这个hello.py怎么办,要去 ps -ef |grep 。。。。,然后kill,要再重启则需要再一次输入nohup python hello.py &,命令越长越麻烦,当然也可以把命令写到shell脚本来减少输入,但管理起进程来还是麻烦了点。

supervisor正好用到,

supervisord -c  xxx.conf启动,如果单独的supervisor那就是默认使用etc/supervisor.conf这个配置了

在etc/supervisor.conf添加程序配置,但是这样十分不太好,配置文件会变得越来越长,

把最下面的include注释取消掉,每个项目使用单独的配置文件,supervisorconfig文件夹下面有两个项目配置文件,*.ini可以包含这两个。

[program:automobile]
command=/root/miniconda3/bin/uwsgi --ini uwsgib.ini ; 程序启动命令
directory=/root/xxxx/automobile
autostart=True ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=root ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/root/yangdefeng/touna/automobile/logs/automobile.out
loglevel=debug ;loglevel 指定了日志的级别,用 Python 的 print 语句输出的日志是不会被记录到日志文件中的,需要搭配 Python 的 logging 模块来输出有指定级别的日志。
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程 另一个文件,这次开两个一模一样的进程。
[program:daili]
command=/root/miniconda3/envs/py27/bin/python dailiip.py ; 程序启动命令
directory=/root/xxx/代理ip获取
numprocs=2 ;默认为1,; 若 numprocs 不为1,process_name 的表达式中一定要包含 process_num 来区分不同的进程
process_name=%(program_name)s_%(process_num)02d
autostart=false ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=root ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/root/yangdefeng/touna/代理ip获取/logs/daili.out
loglevel=debug ;loglevel 指定了日志的级别,用 Python 的 print 语句输出的日志是不会被记录到日志文件中的,需要搭配 Python 的 logging 模块来输出有指定级别的日志。
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
比如我分布式爬虫,先开两个一模一样的进程,当然可以在py中用multiprocessing弄出两个进程来,也可以把脚本运行两次不就是两个进程吗。
那么可以指定numprocs=2,nmprocess大于1的时候,一定要设置process_name=%(program_name)s_%(process_num)02d,后面的格式名字随便,总之要能分辨出来是两个嘛,不然supervisorctl start programe时候怎么知道启动什么进程。如果不设置程序名启动supervisord服务时候会报错的。 使用supervisorctl进入supervisor客户单管理
start xx
stop xx 来启动和停止程序。 reload update在配置修改需要生效时候可以使用。 也可以开启web服务来管理程序,在配置中需要把注释去掉;

输入linux的地址加上9001端口,使用账号和密码登录后就能看到程序状态了。这上面可以控制清楚的知道,启动了那些程序,和控制程序的启动和停止,点击tail -f可以在web中看到程序的日志信息了,不用去xshell中去用tali -f查看了。


很方便的东西,可以用来管理python和非python程序。顺便轻松解决了nohup的日志大小切割问题。
												

linux 使用supervisor来管理进程的更多相关文章

  1. Docker使用 Supervisor 来管理进程

    Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个 ...

  2. linux:查看以及管理进程

    学习笔记内容概要 进程查看的命令:top,ps,pstree 进程管理的命令:kill,nice,renice 查看进程: 一.top工具 top 工具是我们常用的一个查看工具,能实时的查看我们系统的 ...

  3. linux centos Supervisor守护.netcore进程安装配置

    场景:当部署完.netcore程序后 使用dotnet xx.dll 后可以运行,但关闭shell或隔断时间会自动断开,此时部署的.netcore程序就不能访问了,此时需要用到Supervisor了 ...

  4. Linux:使用systemd管理进程

    Blog:博客园 个人 概述 systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能 ...

  5. Supervisor 管理进程,Cloud Insight 监控进程,完美!

    Supervisor 是由 Python 语言编写.基于 linux 操作系统的一款服务器管理工具,用于监控服务器的运行,发现问题能立即自动预警及自动重启等. Cloud Insight 是一款次世代 ...

  6. pm2 代替 Supervisor 管理进程

    前提 我们在使用 Laravel 的时候不免用到列队来处理任务,而 Laravel 官方文档给出的是 Supervisor 来管理进程和监控.但是我们在使用中有下面几个缺点: Supervisor 单 ...

  7. Linux服务:使用Supervisor管理进程

    一.简介 由于基本每个公司都会用到supervisor这个进程管理工具,这里简单阐述一下. Supervisor (http://supervisord.org) 是一个用Python写Linux下的 ...

  8. Django与supervisor 管理进程

    1.前言 在Django项目中,我们需要用到一些独立于Django框架外的脚本.这样一些脚本可能需要独立的持续运行,且具有很强的可维护性,这个时候supervisor就可以排上用场了. 基于pytho ...

  9. supervisor管理进程工具配置

    Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...

随机推荐

  1. sc58x config

    addip=set bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off ...

  2. Medium开发团队谈架构设计_转

    转自:Medium开发团队谈架构设计 背景 说到底,Medium是个社交网络,人们可以在这里分享有意思的故事和想法.据统计,目前累积的用户阅读时间已经超过14亿分钟,合两千六百年. 我们支持着每个月两 ...

  3. java随机范围内的日期

    使用了最新的java8的java.time类,并提供了LocalDateTime和java.util.Date之间的转换. 使用方法: randomLocalDateTime(-3,3) : 取距离今 ...

  4. linux下gzip的压缩/解压缩详解

    linux下gzip的压缩详解 Linux压缩保留源文件的方法: gzip –c filename > filename.gz Linux解压缩保留源文件的方法: gunzip –c filen ...

  5. centos7安装elasticsearch5.2.2

    这篇文章比较初级,介绍的是centos7下elasticsearch的安装. 主要阅读对象是初级运维.初级大数据工程师.java工程师.想了解es的.net工程师以及所有感兴趣的朋友. 文章的目的是为 ...

  6. RavenDb学习(四)处理文档相关性

    RavenDb是文档型数据库,但是我们常常也需要定义对象之间的关系,那RavenDb当中是如何处理的呢? RavenDb提供了优雅的解决方式,使用正确的话,可以减少数据开销以及网络拥堵 Denorma ...

  7. .NET中常见加解密算法

    一.MD5不可逆加密 不可逆加密是指将原文加密成密文以后,无法将密文解密成原文. MD5的算法是公开的,无论是哪种语言,只要需要加密的字符串是相同的,那么经过MD5加密以后生成的结果都是一样的. .N ...

  8. C/C++-STL中lower_bound与upper_bound的用法以及cmp函数

    转载于:http://blog.csdn.net/tjpuacm/article/details/26389441 不加比较函数的情况: int a[]={0,1,2,2,3}; printf(&qu ...

  9. ViewPager一屏显示多个item,及边缘滑动事件优化

    关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout, 然后设置ViewPager和外面的Layout的clipChildren="false ...

  10. activity 与 fragment生命周期

    一.Activity的生命周期图: 二.Fragment生命周期图 三.对比图 Log数据 Activity﹕    onCreateFragment﹕ onAttachFragment﹕ onCre ...