我的编程空间,编程开发者的网络收藏夹
学习永远不晚

[转]Python 守护进程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

[转]Python 守护进程

守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。 
下面是转自一位网友写的编写守护进程的步骤:
1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的
    命令行或shell程序。需要这一步以便保证新进程不是一个进程组头领进程(process
    group leader)。下一步,‘setsid()’,会因为你是进程组头领进程而失败。
2. 调用‘setsid()’ 以便成为一个进程组和会话组的头领进程。由于一个控制终端
    与一个会话相关联,而且这个新会话还没有获得一个控制终端,我们的进程没
    有控制终端,这对于守护程序来说是一件好事。
3. 再次调用‘fork()’所以父进程(会话组头领进程)可以退出。这意味着我们,一
    个非会话组头领进程永远不能重新获得控制终端。
4. 调用‘chdir("/")’确认我们的进程不保持任何目录于使用状态。不做这个会导
    致系统管理员不能卸装(umount)一个文件系统,因为它是我们的当前工作目录。
    [类似的,我们可以改变当前目录至对于守护程序运行重要的文件所在目录]
5. 调用‘umask(0)’以便我们拥有对于我们写的任何东西的完全控制。我们不知
    道我们继承了什么样的umask。
    [这一步是可选的](译者注:这里指步骤5,因为守护程序不一定需要写文件)
6. 调用‘close()’关闭文件描述符0,1和2。这样我们释放了从父进程继承的标
    准输入,标准输出,和标准错误输出。我们没办法知道这些文描述符符可能
    已经被重定向去哪里。注意到许多守护程序使用‘sysconf()’来确认
    ‘_SC_OPEN_MAX’的限制。‘_SC_OPEN_MAX’告诉你每个进程能够打
    开的最多文件数。然后使用一个循环,守护程序可以关闭所有可能的文件描
    述符。你必须决定你需要做这个或不做。如果你认为有可能有打开的文件描
    述符,你需要关闭它们,因为系统有一个同时打开文件数的限制。
7. 为标准输入,标准输出和标准错误输出建立新的文件描述符。即使你不打算
    使用它们,打开着它们不失为一个好主意。准确操作这些描述符是基于各自
    爱好;比如说,如果你有一个日志文件,你可能希望把它作为标准输出和标
    准错误输出打开,而把‘/dev/null’作为标准输入打开;作为替代方法,你可
    以将‘/dev/console’作为标准错误输出和/或标准输出打开,而‘/dev/null’作
    为标准输入,或者任何其它对你的守护程序有意义的结合方法。(译者注:一
    般使用dup2函数原子化关闭和复制文件描述符。
说实话,上面这段文字看着有点云里雾里,下面看个具体的代码(我只粘贴了函数的第一部分,也是最重要的一部分,要查看整个代码,请移步到这http://www.pythonid.com/bbs/redirect.php?tid=239&goto=lastpost&highlight=自行查看):

def daemonize(stdout='/dev/null', stderr=None, stdin='/dev/null',
              pidfile=None, startmsg = 'started with pid %s' ):
    '''
         This forks the current process into a daemon.
         The stdin, stdout, and stderr arguments are file names that
         will be opened and be used to replace the standard file descriptors
         in sys.stdin, sys.stdout, and sys.stderr.
         These arguments are optional and default to /dev/null.
        Note that stderr is opened unbuffered, so
        if it shares a file with stdout then interleaved output
         may not appear in the order that you expect.
     '''
    # flush io
    sys.stdout.flush()
    sys.stderr.flush()
    # Do first fork.
    try:
        pid = os.fork()
        if pid > 0: sys.exit(0) # Exit first parent.
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
        sys.exit(1)      
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid()
    # Do second fork.
    try:
        pid = os.fork()
        if pid > 0: sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
        sys.exit(1)
    # Open file descriptors and print start message
    if not stderr: stderr = stdout
        si = file(stdin, 'r')
        so = file(stdout, 'a+')
        se = file(stderr, 'a+', 0)  #unbuffered
        pid = str(os.getpid())
        sys.stderr.write("\n%s\n" % startmsg % pid)
        sys.stderr.flush()
    if pidfile: file(pidfile,'w+').write("%s\n" % pid)
    # Redirect standard file descriptors.
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

仔细比对前面说的步骤和代码,大体上是没有什么问题了,但是疑问就来了,os.fork()到底是怎么工作的呢,GOOGLE了个遍,最后的结论是这样:
  父进程执行代码到os.fork()处时,会将自己整个拷贝一份(即子进程)这时候父进程os.fork()的返回值大于零(即子进程的PID),子进程os.fork()的返回值等于零,父进程结束,子进程继续执行,这时候又遇到第二个os.fork(),如上次一样,原来的子进程变成了父进程,又产生新的子进程,之后父进程就结束。这就能够说通第一次是避免process group leader,第二次是避免session group leader。子进程就变成了一个无终端,无会话的完全自我掌控的后台进程了。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

[转]Python 守护进程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

[转]Python 守护进程

守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。  下面是转自一位网友写的编写守护进程的步骤: 1. 调用fork()以便父进程可
2023-01-31

Python 守护进程

nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下:daemonize.py#!/usr/bin/python #coding:utf-8  import sys imp
2023-01-31

python守护进程

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就
2023-01-31

python 守护进程(daemon)

守护进程的编写步骤:1、fork子进程,然后父进程退出,此时子进程会被init进程接管。2、修改子进程的工作目录,创建新进程组合新会话,修改umask。3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。4、重定向孙子
2023-01-31

Python setdaemon守护进程

setdaemon守护进程#_*_coding:utf-8_*___author__ = 'gaogd'import timeimport threading'''守护进程,如果主线程down了,子线程也就没有了。下面先通过主进程生成mai
2023-01-31

Python守护进程daemon实现

1.1 守护进程守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。在
2023-01-31

python daemon守护进程实现

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。 守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实
2022-06-04

linux 守护进程详解及建立守护进程

linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程。守护进程的启动要启动一个守护进程,可以采取一下几种方式:在系统期间通过系统的初始化脚本启动守护进程。这些脚本通常在目录etc/rc.d下,通过它
2022-06-04

Python实现Daemon(守护)进程

最近在写Daemon进程,在编写过程中遇到一些小麻烦,最终还是解决了。我编写了两种,第一种是编写了一个程序,将其用setsid命令让其放入后台运行,第二种是直接fork()一个进程,在代码里将进程设置为后台启动。在os.sytem()函数其
2023-01-31

如何进行Python进程的守护进程实施

如何进行Python进程的守护进程实施,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python进程这一计算机语言在实际的应用中,如果你在实际应用的过程中遇到相
2023-06-17

python中的daemon守护进程实现

守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。守护进程的特性1.在后台运行2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制
2023-01-31

Python模块整理(六):守护进程

守护进程三个特征:在后台运行,与启动它的进程脱离,无须控制终端。>>> def run(program, *args):...     pid = os.fork()...     if pid==0:#pid==0为在子进程内 在子进程内
2023-01-31

python守护进程监控子进程怎么实现

在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下:导入multiprocessing模块。import multiprocessing创建一个子进程的函数。def child_proces
2023-10-23

Python全栈的进程和守护进程是怎样的

这期内容当中小编将会给大家带来有关Python全栈的进程和守护进程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 理解进程进程的概念:(process)进程就是正在运行的程序,它是操作系统中,
2023-06-22

python使用fork实现守护进程的方法

os模块中的fork方法可以创建一个子进程。相当于克隆了父进程 os.fork() 子进程运行时,os.fork方法会返回0;而父进程运行时,os.fork方法会返回子进程的PID号。 所以可以使用PID来区分两个进程:#!/usr/bin
2022-06-04

PHP怎么实现守护进程

今天小编给大家分享一下PHP怎么实现守护进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。成为守护进程的步骤其实只需要创建子
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录