脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python守护进程(daemon)代码实例

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

2019-11-23 17:41junjie Python

这篇文章主要介绍了Python守护进程(daemon)代码实例,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下

  1. # -*-coding:utf-8-*- 
  2. import sys, os 
  3.   
  4. '''将当前进程fork为一个守护进程 
  5.   
  6.   注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 
  7.   所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有 
  8.   chdir() 和 umask()了 
  9. ''
  10. def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'): 
  11.   '''Fork当前进程为守护进程,重定向标准文件描述符 
  12.     (默认情况下定向到/dev/null) 
  13.   ''
  14.   #Perform first fork. 
  15.   try
  16.     pid = os.fork() 
  17.     if pid > 0: 
  18.       sys.exit(0) #first parent out 
  19.   except OSError, e: 
  20.     sys.stderr.write("fork #1 failed: (%d) %s\n" %(e.errno, e.strerror)) 
  21.     sys.exit(1) 
  22.   
  23.   #从母体环境脱离 
  24.   os.chdir("/"
  25.   os.umask(0) 
  26.   os.setsid() 
  27.   #执行第二次fork 
  28.   try
  29.     pid = os.fork() 
  30.     if pid > 0: 
  31.       sys.exit(0) #second parent out 
  32.   except OSError, e: 
  33.     sys.stderr.write("fork #2 failed: (%d) %s]n" %(e.errno,e.strerror)) 
  34.     sys.exit(1) 
  35.   
  36.   #进程已经是守护进程了,重定向标准文件描述符 
  37.   for f in sys.stdout, sys.stderr: f.flush() 
  38.   si = file(stdin, 'r'
  39.   so = file(stdout,'a+'
  40.   se = file(stderr,'a+',0) 
  41.   os.dup2(si.fileno(), sys.stdin.fileno()) 
  42.   os.dup2(so.fileno(), sys.stdout.fileno()) 
  43.   os.dup2(se.fileno(), sys.stderr.fileno()) 
  44.   
  45. def _example_main(): 
  46.   '''示例函数:每秒打印一个数字和时间戳''' 
  47.   import time 
  48.   sys.stdout.write('Daemon started with pid %d\n' % os.getpid()) 
  49.   sys.stdout.write('Daemon stdout output\n'
  50.   sys.stderr.write('Daemon stderr output\n'
  51.   
  52.   c = 0 
  53.   while True: 
  54.     sys.stdout.write('%d: %s\n' %(c, time.ctime())) 
  55.     sys.stdout.flush() 
  56.     c = c+1 
  57.     time.sleep(1) 
  58.   
  59. if __name__ == "__main__"
  60.   daemonize() 
  61.   _example_main() 
  62. ''
  63. 第一个fork是为了让shell返回,同时让你完成setsid(从你的控制终端移除,这样就不会意外地收到信号)。setsid使得这个进程成为“会话领导(session leader)”,即如果这个进程打开任何终端,该终端就会成为此进程的控制终端。我们不需要一个守护进程有任何控制终端,所以我们又fork一次。在第二次fork之后,此进程不再是一个“会话领导”,这样它就能打开任何文件(包括终端)且不会意外地再次获得一个控制终端 
  64.   
  65. 另外说明: 
  66. umask()函数为进程设置文件模式创建屏蔽字,并返回以前的值 
  67. 在shell命令行输入:umask 就可知当前文件模式创建屏蔽字 
  68. 常见的几种umask值是002,022和027,002阻止其他用户写你的文件,022阻止同组成员和其他用户写你的文件,027阻止同组成员写你的文件以及其他用户读写或执行你的文件 
  69. rwx-rwx-rwx 代表是777 所有的人都具有权限读写与执行 
  70.   
  71. chmod()改变文件的权限位 
  72. int dup(int filedes) 返回新文件描述符一定是当前文件描述符中的最小数值 
  73. int dup2(int filedes, int filedes2);这两个函数返回的新文件描述符与参数filedes共享同一个文件表项。 
  74. ''

延伸 · 阅读

精彩推荐