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的库函数时不会出乎意料的失败;
实例:
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."""
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()
|
Python创建daemon相关推荐
- Linux中创建Daemon进程的三种方法
Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...
- Python创建进程类Process
1. Python创建进程类Process python的multiprocessing模块提供了一个创建进程的类Precess,其创建有以下两种方法: 创建Process类的实例,并指向目标函数和传 ...
- reddit_如何使用Python创建自定义Reddit通知系统
reddit by Kelsey Wang 王凯西 如何使用Python创建自定义Reddit通知系统 (How to make a custom Reddit notification system ...
- python做bi系统_如何使用Python创建可视化对象
早前,Power BI就已经支持使用Python创建可视化对象了,当你遇到自定义程度较高的可视化对象时,Python就大大的派上了用场:那么我们如何使用呢?接下来小悦就为各位伙伴们介绍一下吧~ 首先, ...
- 独家 | 手把手教你用Python创建简单的神经网络(附代码)
作者:Michael J.Garbade 翻译:陈之炎 校对:丁楠雅 本文共2000字,建议阅读9分钟. 本文将为你演示如何创建一个神经网络,带你深入了解神经网络的工作方式. 了解神经网络工作方式的最 ...
- 使用python创建自己的第一个神经网络模型吧!
神经网络(NN),也被称为人工神经网络(ANN),是机器学习领域中学习算法的子集,大体上借鉴了生物神经网络的概念.目前,神经网络在计算机视觉.自然语言处理等领域应用广泛.德国资深机器学习专家Andre ...
- 如何使用 Python 创建一名可操控的角色玩家
2019独角兽企业重金招聘Python工程师标准>>> 在 这个系列的第一篇文章 中,我解释了如何使用 Python 创建一个简单的基于文本的骰子游戏.在第二部分中,我向你们展示了如 ...
- 【LINUX】——linux如何使用Python创建一个web服务
问:linux如何使用Python创建一个web服务? 答:一句话,Python! 一句代码: /usr/local/bin/python -m SimpleHTTPServer 8686 > ...
- python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...
原标题:推荐 :手把手教你用Python创建简单的神经网络(附代码) 作者:Michael J.Garbade:翻译:陈之炎:校对:丁楠雅 本文共2000字,9分钟. 本文将为你演示如何创建一个神经网 ...
最新文章
- android 组装xml,Android中组装xml文件内容
- JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter
- SQL Server 2012 安装杂谈
- 怎么画正五边形步骤_每个药店必备三伏贴的POP海报,我教你画
- 碰到问题集锦(简述)1
- CLion 2016.1新增Python、Swift支持,并改进了C++支持
- SAP Cloud for Customer的Container应用设计原理
- Spring基础面试题-同步更新
- Linux宝库名人轶事栏目 | 云与我
- C语言 数组和指针
- 谈谈Integer中的静态类IntegerCache
- 【干货分享】大话团队的GIT分支策略进化史
- gdb 打印参数出错:which is more than max-value-size
- php 带参页面跳转页面,跳转页面带参数_如何带参数跳转php界面
- MySQL 5.7 深度解析: JSON数据类型使用
- Java九阳神功-抽象方法与抽象类
- 网易云音乐视频全屏无法关闭
- overlayfs源代码解析
- 《剑指offer》NO34 二叉树中和为某一值的路径 详解 <Java实现>
- 如何删去微信小程序服务器,微信小程序怎么注销