Python守护进程(daemon)代码实例


Posted in Python onMarch 06, 2015
# -*-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 相关文章推荐
把大数据数字口语化(python与js)两种实现
Feb 21 Python
用Python抢过年的火车票附源码
Dec 07 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
python select.select模块通信全过程解析
Sep 20 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 Python
Python编写nmap扫描工具
Jul 21 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
Python类方法__init__和__del__构造、析构过程分析
Mar 06 #Python
Python列表生成器的循环技巧分享
Mar 06 #Python
Python装饰器使用示例及实际应用例子
Mar 06 #Python
Python迭代器和生成器介绍
Mar 06 #Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 #Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 #Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 #Python
You might like
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
基于JQuery的日期联动实现代码
2011/02/24 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
python函数局部变量用法实例分析
2015/08/04 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
Flask之flask-script模块使用
2018/07/26 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
应用化学专业职业生涯规划书
2014/01/22 职场文书
作风转变年心得体会
2014/10/22 职场文书
员工手册编写范本
2015/05/14 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python