参考《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的库函数时不会出乎意料的失败;

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import sys,os,time
def main():
    """ A demo daemon main routine, write a datestamp to /tmp/daemon-log every 10 seconds."""
    = 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()

本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1561297,如需转载请自行联系原作者

Python创建daemon相关推荐

  1. Linux中创建Daemon进程的三种方法

    Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...

  2. Python创建进程类Process

    1. Python创建进程类Process python的multiprocessing模块提供了一个创建进程的类Precess,其创建有以下两种方法: 创建Process类的实例,并指向目标函数和传 ...

  3. reddit_如何使用Python创建自定义Reddit通知系统

    reddit by Kelsey Wang 王凯西 如何使用Python创建自定义Reddit通知系统 (How to make a custom Reddit notification system ...

  4. python做bi系统_如何使用Python创建可视化对象

    早前,Power BI就已经支持使用Python创建可视化对象了,当你遇到自定义程度较高的可视化对象时,Python就大大的派上了用场:那么我们如何使用呢?接下来小悦就为各位伙伴们介绍一下吧~ 首先, ...

  5. 独家 | 手把手教你用Python创建简单的神经网络(附代码)

    作者:Michael J.Garbade 翻译:陈之炎 校对:丁楠雅 本文共2000字,建议阅读9分钟. 本文将为你演示如何创建一个神经网络,带你深入了解神经网络的工作方式. 了解神经网络工作方式的最 ...

  6. 使用python创建自己的第一个神经网络模型吧!

    神经网络(NN),也被称为人工神经网络(ANN),是机器学习领域中学习算法的子集,大体上借鉴了生物神经网络的概念.目前,神经网络在计算机视觉.自然语言处理等领域应用广泛.德国资深机器学习专家Andre ...

  7. 如何使用 Python 创建一名可操控的角色玩家

    2019独角兽企业重金招聘Python工程师标准>>> 在 这个系列的第一篇文章 中,我解释了如何使用 Python 创建一个简单的基于文本的骰子游戏.在第二部分中,我向你们展示了如 ...

  8. 【LINUX】——linux如何使用Python创建一个web服务

    问:linux如何使用Python创建一个web服务? 答:一句话,Python! 一句代码: /usr/local/bin/python -m SimpleHTTPServer 8686 > ...

  9. python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...

    原标题:推荐 :手把手教你用Python创建简单的神经网络(附代码) 作者:Michael J.Garbade:翻译:陈之炎:校对:丁楠雅 本文共2000字,9分钟. 本文将为你演示如何创建一个神经网 ...

最新文章

  1. android 组装xml,Android中组装xml文件内容
  2. JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter
  3. SQL Server 2012 安装杂谈
  4. 怎么画正五边形步骤_每个药店必备三伏贴的POP海报,我教你画
  5. 碰到问题集锦(简述)1
  6. CLion 2016.1新增Python、Swift支持,并改进了C++支持
  7. SAP Cloud for Customer的Container应用设计原理
  8. Spring基础面试题-同步更新
  9. Linux宝库名人轶事栏目 | 云与我
  10. C语言 数组和指针
  11. 谈谈Integer中的静态类IntegerCache
  12. 【干货分享】大话团队的GIT分支策略进化史
  13. gdb 打印参数出错:which is more than max-value-size
  14. php 带参页面跳转页面,跳转页面带参数_如何带参数跳转php界面
  15. MySQL 5.7 深度解析: JSON数据类型使用
  16. Java九阳神功-抽象方法与抽象类
  17. 网易云音乐视频全屏无法关闭
  18. overlayfs源代码解析
  19. 《剑指offer》NO34 二叉树中和为某一值的路径 详解 <Java实现>
  20. 如何删去微信小程序服务器,微信小程序怎么注销

热门文章

  1. SAP_SD常用增强
  2. 自动机器学习:团队如何在自动学习项目中一起工作?
  3. 图神经网络(AliGraph)在阿里巴巴的发展与应用
  4. 2019 快过去了,自动驾驶发展得怎么样了?
  5. 真正的人工智能至少还要几百年才能实现,你信吗?
  6. 深度学习:自然语言处理(五)NLTK的经典应用
  7. 使用bash工具创建ssh key
  8. vscode使用markdown语言编写文本
  9. 普京谈“元宇宙”:这无疑是一种挑战
  10. 【智能驾驶】自动驾驶深度感知技术对车和行人的检测