- # -*-coding:utf-8-*-
- import sys, os
- '''将当前进程fork为一个守护进程
- 注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了
- 所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有
- chdir() 和 umask()了
- '''
- def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'):
- '''Fork当前进程为守护进程,重定向标准文件描述符
- (默认情况下定向到/dev/null)
- '''
- #Perform first fork.
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0) #first parent out
- except OSError, e:
- sys.stderr.write("fork #1 failed: (%d) %s\n" %(e.errno, e.strerror))
- sys.exit(1)
- #从母体环境脱离
- os.chdir("/")
- os.umask(0)
- os.setsid()
- #执行第二次fork
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0) #second parent out
- except OSError, e:
- sys.stderr.write("fork #2 failed: (%d) %s]n" %(e.errno,e.strerror))
- sys.exit(1)
- #进程已经是守护进程了,重定向标准文件描述符
- for f in sys.stdout, sys.stderr: f.flush()
- si = file(stdin, 'r')
- so = file(stdout,'a+')
- se = file(stderr,'a+',0)
- os.dup2(si.fileno(), sys.stdin.fileno())
- os.dup2(so.fileno(), sys.stdout.fileno())
- os.dup2(se.fileno(), sys.stderr.fileno())
- def _example_main():
- '''示例函数:每秒打印一个数字和时间戳'''
- import time
- sys.stdout.write('Daemon started with pid %d\n' % os.getpid())
- sys.stdout.write('Daemon stdout output\n')
- sys.stderr.write('Daemon stderr output\n')
- c = 0
- while True:
- sys.stdout.write('%d: %s\n' %(c, time.ctime()))
- sys.stdout.flush()
- c = c+1
- time.sleep(1)
- if __name__ == "__main__":
- daemonize()
- _example_main()
- '''
- 第一个fork是为了让shell返回,同时让你完成setsid(从你的控制终端移除,这样就不会意外地收到信号)。setsid使得这个进程成为“会话领导(session leader)”,即如果这个进程打开任何终端,该终端就会成为此进程的控制终端。我们不需要一个守护进程有任何控制终端,所以我们又fork一次。在第二次fork之后,此进程不再是一个“会话领导”,这样它就能打开任何文件(包括终端)且不会意外地再次获得一个控制终端
- 另外说明:
- umask()函数为进程设置文件模式创建屏蔽字,并返回以前的值
- 在shell命令行输入:umask 就可知当前文件模式创建屏蔽字
- 常见的几种umask值是002,022和027,002阻止其他用户写你的文件,022阻止同组成员和其他用户写你的文件,027阻止同组成员写你的文件以及其他用户读写或执行你的文件
- rwx-rwx-rwx 代表是777 所有的人都具有权限读写与执行
- chmod()改变文件的权限位
- int dup(int filedes) 返回新文件描述符一定是当前文件描述符中的最小数值
- int dup2(int filedes, int filedes2);这两个函数返回的新文件描述符与参数filedes共享同一个文件表项。
- '''
Python守护进程(daemon)代码实例
2019-11-23 17:41junjie Python
这篇文章主要介绍了Python守护进程(daemon)代码实例,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下
延伸 · 阅读
- 2022-03-11用Python实现一个模仿UP主弹幕控制的直播间功能
- 2022-03-11Python实战之设计一个多功能办公小工具
- 2022-03-11Python数据分析之缺失值检测与处理详解
- 2022-03-11Python变量的作用域详解
- 2022-03-11Python之捕捉异常详解
- 2022-03-11Python进度条可视化之监测程序运行速度
- Python
Python实现ping指定IP的示例
今天小编就为大家分享一篇Python实现ping指定IP的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...
- Python
python 插入Null值数据到Postgresql的操作
这篇文章主要介绍了python 插入Null值数据到Postgresql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...
- Python
Python的dict字典结构操作方法学习笔记
这篇文章主要介绍了Python的dict字典结构操作方法学习笔记本,字典的操作是Python入门学习中的基础知识,需要的朋友可以参考下...
- Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
在本篇内容里小编给大家分享的是关于Python3以GitHub为例来实现模拟登录和爬取的实例讲解,需要的朋友们可以参考下。 ...
- Python
使用NumPy和pandas对CSV文件进行写操作的实例
今天小编就为大家分享一篇使用NumPy和pandas对CSV文件进行写操作的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...
- Python
python 列表转为字典的两个小方法(小结)
这篇文章主要介绍了python 列表转为字典的两个小方法(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...
- Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
这篇文章主要介绍了在Windows系统上搭建Nginx+Python+MySQL环境的教程,文中使用flup中间件及FastCGI方式连接,需要的朋友可以参考下 ...
- Python
python直接访问私有属性的简单方法
下面小编就为大家带来一篇python直接访问私有属性的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...