作者:hK手机用户2927565637qq | 来源:互联网 | 2022-12-29 11:18
python下编写守护进程**1如何使用Python守护进程和脚本项目过程中,经常会有很多的脚本,Shell脚本、PHP脚本、Python脚本等,更有一些脚本是需要常驻内存执行的,
python下编写守护进程
**1
如何使用Python守护进程和脚本
项目过程中,经常会有很多的脚本,Shell脚本、PHP脚本、Python脚本等,更有一些脚本是需要常驻内存执行的,简而言之就是需要while(true){}的模式执行。但是有的时候,一个常驻内存的进程会因为某些耗时操作而夯住,不再往下继续执行,成为了一个僵尸进程;或者因为某个操作偶然出错,直接退出了;所以我们需要有一套简单的机制来保证进程一直处于活跃状态。
python写一个后台的守护进程
imp
ubuntu python怎么作为守护进程一直运行
测试程序先写一个测试程序,用于输出日志和打印到控制台。#-*- coding: utf-8 -*-import loggingimport timefrom logging.handlers import RotatingFileHandlerdef func():init_log()while True:print "output to the console"logging.debug("output the debug log")logging.info("output the info log")time.sleep(3);def init_log():logging.getLogger().setLevel(logging.DEBUG)cOnsole= logging.StreamHandler()console.setLevel(logging.DEBUG)formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')console.setFormatter(formatter)logging.getLogger().addHandler(console)# add log ratateRthandler = RotatingFileHandler("backend_run.log", maxBytes=10 * 1024 * 1024, backupCount=100,encoding="gbk")Rthandler.setLevel(logging.INFO)# formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')Rthandler.setFormatter(formatter)logging.getLogger().addHandler(Rthandler)if __name__ == '__main__':func()后台启动Python脚本可以使用下面的命令来启动上面的脚本,让Python在后台运行。
nohup python -u main.py > test.out 2>&1 &来解释一下这几个命令的参数。
这一段来自其中 0、1、2分别代表如下含义:0 – stdin (standard input)1 – stdout (standard output)2 – stderr (standard error)nohup python -u main.py > test.out 2>&1 &nohup+最后面的& 是让命令在后台执行>out.log 是将信息输出到out.log日志中2>&1 是将标准错误信息转变成标准输出,这样就可以将错误信息输出到out.log 日志里面来。运行命令后,会返回一个pid。像下面这样:[1] 9208后续可以学习Hadoop它们,把pid存起来,到时候stop的时候就把它杀掉。跟踪输出文件变化为了验证脚本可以在后台继续运行,我们退出当前会话。
然后重新连接一个Session,然后输入下面的命令来跟踪文件的输出:tail -f test.out输出内容如下:output to the console2017-03-21 20:15:02,632 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:02,632 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:05,635 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:05,636 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:08,637 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:08,638 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:11,640 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:11,642 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:14,647 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:14,647 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:17,653 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:17,654 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:20,655 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:20,656 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:23,661 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:23,661 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:26,665 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:26,666 main.py[line:12] INFO output the info logoutput to the console2017-03-21 20:15:29,670 main.py[line:11] DEBUG output the debug log2017-03-21 20:15:29,671 main.py[line:12] INFO output the info log说明我们的脚本确实在后台持续运行。结束程序可以直接通过之前的那个pid杀掉脚本,或者可以通过下面的命令查找pid。ps -ef | grep python输出的内容如下:root 1659 1 0 17:40 ? 00:00:00 /usr/bin/python /usr/lib/python2.6/site-packages/ambari_agent/AmbariAgent.py startroot 1921 1659 0 17:40 ? 00:00:48 /usr/bin/python /usr/lib/python2.6/site-packages/ambari_agent/main.py startuser 8866 8187 0 20:03 ? 00:00:06 /usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-maproot 9208 8132 0 20:12 pts/16 00:00:00 python -u main.pyroot 9358 8132 0 20:17 pts/16 00:00:00 grep --color=auto python可以看到我们的pid是9208,调用kill杀掉就可以了。
kill -9 9208编写启动及停止脚本启动脚本#!/bin/shpid=`ps -ef|grep "python -u main.py"| grep -v "grep"|awk '{print $2}'`if [ "$pid" != "" ]thenecho "main.py already run, stop it first"kill -9 ${pid}fiecho "starting now..."nohup python -u main.py > test.out 2>&1 &pid=`ps -ef|grep "python -u main.py"| grep -v "grep"|awk '{print $2}'`echo ${pid} > pid.outecho "main.py started at pid: "${pid}停止脚本#!/bin/shpid=`ps -ef|grep "python -u main.py"| grep -v "grep"|awk '{print $2}'`if [ "$pid" != "" ]thenkill -9 ${pid}echo "stop main.py complete"elseecho "main.py is not run, there's no need to stop it"fi稍后我会把实例代码上传到资料共享里面。
Linux下的守护进程的概念?daemon.py是什么意思?
守护进程一般是服务器类程序中用来无限循环等待事件发生的一个进程或线程,也就是说,它的作用是等待一个事件发生,事件发生后调用另外的进程区完成相应的工作,自己再回去等事件发生。用ps aux查看进程的进程号,然后用kill杀掉py是后缀名,意思是用python语言写的。
至于如何重启,这个没有统一的方法。
你可以查看相关的文档,或者在google上搜索,或者man一下。守护进程一个或者多个都是可能的。
如何使用Python的Supervisor来管理进程
在python开发中,如何使用supervisor来管理进程呢?Supervisor是什么?Supervisor是如何管理进程的,现在就跟随小编一起来看看使用python的supervisor管理经常的方法。Supervisor可以启动、停止、重启*nix系统中的程序。
也可以重启崩溃的程序。
supervisord的一个守护进程,用于将指定的进程当做子进程来运行。supervisorctl是一个客户端程序,可以查看日志并通过统一的会话来控制进程。看例子:我们写了一个py脚本,用于往log文件中记录一条当前的时间。[python]view plaincopy1.root@ubuntu:/home/zoer#catdaemon.py2.#!/usr/bin/envpython3.4.importtime5.importos6.time.sleep(1)7.f=open("log",'a')8.t=time.time()9.f.write(str(t))10.f.write("\n")11.f.close()安装过程就不说了。
安装完毕supervisor之后【将配置文件放在/etc下】。修改配置文件,在最后增加如下内容:[program:ddd]command=/home/zoer/daemon.pyautorestart=true然后我们启动supervisor并启动daemon.py的执行。[python]view plaincopy1.root@ubuntu:/home/zoer#supervisord2./usr/local/lib/python2.7/dist-packages/supervisor-3.0b1-py2.7.egg/supervisor/options.py:286:UserWarning:Supervisordisrunningasrootanditissearchingforitsconfigurationfileindefaultlocations(includingitscurrentworkingdirectory);youprobablywanttospecifya"-c"argumentspecifyinganabsolutepathtoaconfigurationfileforimprovedsecurity.3.'Supervisordisrunningasrootanditissearching'4.root@ubuntu:/home/zoer#supervisorctl5.dddSTARTING6.supervisor>startddd7.ddd:ERROR(alreadystarted)8.supervisor>stopddd9.ddd:stopped10.supervisor>startddd11.ddd:started12.supervisor>从上面的例子中,看到,可以通过start或者stop命令来启动或者停止ddd这个进程。
ddd这里就是我们在配置文件中增加的内容(daemon.py这个脚本)。也可以使用restart。如下:supervisor> restart dddddd: stoppedddd: started-------------------------------------------------------下面我们测试一下,假设说我们手动kill掉了ddd这个进程,那么ddd会自动恢复执行吗?为了做实验,把代码修改如下:[python]view plaincopy1.root@ubuntu:/home/zoer#catdaemon.py2.#!/usr/bin/envpython3.4.importtime5.importos6.whileTrue:7.time.sleep(1)8.f=open("log",'a')9.t=time.time()10.f.write(str(t))11.f.write("\n")12.f.close()通过ps可以找到这个进程的id:[plain]view plaincopy1.root93540.20.4109244200?S23:160:00python/home/zoer/daemon.py2.root93950.00.04392832pts/3S+23:170:00grep--color=autodaemon3.root@ubuntu:/home/zoer#看下面的操作:[plain]view plaincopy1.root@ubuntu:/home/zoer#rmlog;touchlog;kill93542.root@ubuntu:/home/zoer#catlog3.1364710712.514.root@ubuntu:/home/zoer#catlog5.1364710712.516.1364710713.517.root@ubuntu:/home/zoer#catlog8.1364710712.519.1364710713.5110.root@ubuntu:/home/zoer#catlog11.1364710712.5112.1364710713.5113.1364710714.5214.root@ubuntu:/home/zoer#catlog15.1364710712.5116.1364710713.5117.1364710714.5218.1364710715.52删除了log文件,并且重新创建。
然后干掉了daemon.py的那个进程。会发现log内容又重新有新的内容了。再次ps查看进程号。
[plain]view plaincopy1.root94290.10.4109244200?S23:180:00python/home/zoer/daemon.py2.root94400.00.04392828pts/3S+23:190:00grep--color=autodaemon3.root@ubuntu:/home/zoer#会发现进程号已经变成9429了。说明supervisor已经重启了被干掉了的进程。