Python创建daemon

参考《Linux/Unix 系统编程手册》

变成daemon,一个程序需要完成以下步骤:

1、执行一个fork(),父进程退出,子进程继续执行。(daemon成为了init进程的子进程)

--假设daemon是从命令行启动,父进程的终止会被shell发现,之后shell会显示出另一个shell提示符并让子进程在后台运行;

--子进程被确保不会成为一个进程组的首进程(它从父进程继承了进程组ID,并拥有了自己唯一的进程ID,该进程ID与继承来的进程组ID是不同的,这样才能成功执行下面一个步骤)

2、子进程调用setsid()开启一个新会话并释放它与控制终端之间的所有关联;

3、对于终端设备的处理:

--daemon从未打开过终端设备,不需做任何处理;

--daemon后面可能会打开一个终端设备,必须采取措施确保该设备不会成为控制终端,具体措施:

1、在所有可能应用到一个终端设备上的open() 调用中指定O_NOCTTY标记;

2、在setsid()调用之后执行第二个fork(),再次让父进程退出并让孙子进程继续执行,(这样确保了子进程不会成为会话组长,进程永远不会重新请求一个控制终端--根据SystemV中获取终端规则)

4、清除进程的umask(确保daemon创建文件和目录时拥有必要的权限)

5、修改进程当前工作目录(通常改为根目录 /,保证根目录的文件系统不会被卸载即可,如:cron会将自身放在/var/spool/cron 目录下)

6、关闭daemon从父进程继承而来的所有打开着的文件描述符(由于daemon失去了控制终端,对0,1,2描述符完全可以关闭;无法卸载长时间运行的daemon打开的文件所在的文件系统----文件描述符是一种有限资源)

7、关闭0,1,2文件描述符后,daemon通常会打开/dev/null,并让所有描述符都指向该设备

--这样确保了当daemon调用在这些文件描述符上执行IO的库函数时不会出乎意料的失败;

实例:

import sys,os,time

def main():
    """ A demo daemon main routine, write a datestamp to /tmp/daemon-log every 10 seconds."""

    f = open("/tmp/daemon-log", "w") 
    while 1: 
        f.write(‘%s/n‘ % time.ctime(time.time())) 
        f.flush() 
        time.sleep(10) 

if __name__ == "__main__":
    # do the UNIX double-fork magic
    try: 
        pid = os.fork() 
        if pid > 0:
            # exit first parent
            sys.exit(0) 
    except OSError, e: 
        print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) 
        sys.exit(1)

    # decouple from parent environment
    os.chdir("/") 
    os.setsid() 
    os.umask(0) 

    # do second fork
    try: 
        pid = os.fork() 
        if pid > 0:
            # exit from second parent, print eventual PID before
            print "Daemon PID %d" % pid 
            sys.exit(0) 
    except OSError, e: 
        print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) 
        sys.exit(1) 

    # start the daemon main loop
    main()
时间: 2024-10-06 04:55:34

Python创建daemon的相关文章

Python创建list和按照索引访问list

Python创建list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.比如,列出班里所有同学的名字,就可以用一个list表示:>>> ['Michael', 'Bob', 'Tracy']['Michael', 'Bob', 'Tracy']list是数学意义上的有序集合,也就是说,list中的元素是按照顺序排列的. 构造list非常简单,按照上面的代码,直接用 [ ] 把list的所有元素都括起来,就是一个list对象.通常,

python创建迅雷批量任务

其实不是真的创建了批量任务,而是用python创建一个文本文件,每行一个要下载的链接,然后打开迅雷,复制文本文件的内容,迅雷监测到剪切板变化,弹出下载全部链接的对话框~~ 实际情况是这样的,因为用python分析网页非常,比如下载某页中的全部pdf链接 1 from __future__ import unicode_literals 2 from bs4 import BeautifulSoup 3 import requests 4 import codecs 5 6 r = request

使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据

应用场景: 我们需要设计一个数据库来保存多个文档中每个文档的关键字.假如我们每个文档字符都超过了1000,取其中出现频率最大的为我们的关键字. 假设每个文档的关键字都超过了300,每一个文件的0-299号存储的是我们的关键字.那我们要建这样一个数据库,手动输入这样的一个表是不现实的,我们只有通过程序来帮我实现这个重复枯燥的操作. 具体的示意图如下所示: 首先图1是我们的原始表格: 图1 这个时候我们需要程序来帮我们完成自动字段的创建和数据的插入. 图2 上图是我们整个表的概况.下面我们就用程序来

Kivy A to Z -- 如何从Python创建一个基于Binder的Service及如何从Java访问Python创建的Service

<Kivy A to Z -- 如何从python代码中直接访问Android的Service> 一文中讲到了如何从python访问java的service,这一篇再来讲下如何创建一个基于Binder的Python Service以及如何从Java代码中访问这个Python创建的Service. 先来看代码,再作下解释: 接<Kivy A to Z -- 如何从python代码中直接访问Android的Service>一文,我们在相关的文件中增加代码: binder_wrap.cp

使用Django和Python创建Json response

使用jquery的.post提交,并期望得到多个数据,Python后台要使用json格式. 不指定datatype为json,让jquery自行判断数据类型.(注:跨域名请求数据,则使用 jsonp字符串) 若post指定数据类型json,则python取post数据,我觉着麻烦.让jquery智能判断,python返回字典最方便. 一般使用字典,而不是列表来返回 JSON内容. import json from django.http import HttpResponse response_

【译】使用python创建一个简单的restful风格的webservice应用

这是一个如何使用python快速构建简单restful风格webservice的应用教程. 1.分析rest路由规则 rest风格的服务通常使用web.py来创建服务器端脚本,一般情况下包含两个url路径: 一个是为了查询所有用户,一个是为了查询单个用户. 例如下面的url: http://localhost:8080/users http://localhost:8080/users/{id} 2.搭建web.py环境 首先你应该安装web.py模块到你的python环境下.如果你之前没有的话

[翻译] 使用 Python 创建你自己的 Shell:Part II

使用 Python 创建你自己的 Shell:Part II [TOC] 原文链接与说明 https://hackercollider.com/articles/2016/07/06/create-your-own-shell-in-python-part-2/ 本翻译文档原文选题自 Linux中国 ,翻译文档版权归属 Linux中国 所有 在 part 1 中,我们已经创建了一个主要的 shell 循环.切分了的命令输入,以及通过 fork 和 exec 执行命令.在这部分,我们将会解决剩下的

[翻译] 使用 Python 创建你自己的 Shell:Part I

使用 Python 创建你自己的 Shell:Part I [TOC] 原文链接与说明 https://hackercollider.com/articles/2016/07/05/create-your-own-shell-in-python-part-1/ 本翻译文档原文选题自 Linux中国 ,翻译文档版权归属 Linux中国 所有 我很想知道一个 shell (像 bash,csh 等)内部是如何工作的.为了满足自己的好奇心,我使用 Python 实现了一个名为 yosh (Your O

Python 创建和使用类

python创建和使用类的方法如下 # class Dog(): # def __init__(self,name,age): # self.name=name # self.age=age # # def sit(self): # print(self.name.title()+"is now sitting") # # def roll_over(self): # print(self.name.title()+" rolled over!") # # my_d