热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python下编写守护进程

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已经重启了被干掉了的进程。


推荐阅读
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Android开发中,实现多点触控功能需要使用`OnTouchListener`监听器来捕获触摸事件,并在`onTouch`方法中进行详细的事件处理。为了优化多点触控的交互体验,开发者可以通过识别不同的触摸手势(如缩放、旋转等)并进行相应的逻辑处理。此外,还可以结合`MotionEvent`类提供的方法,如`getPointerCount()`和`getPointerId()`,来精确控制每个触点的行为,从而提升用户操作的流畅性和响应性。 ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
author-avatar
hK手机用户2927565637qq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有