python 守护进程(daemon)

简介:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
守护进程的编写步骤:
1 、fork子进程,然后父进程退出,此时子进程会被init进程接管。
2 、修改子进程的工作目录,创建新进程组合新会话,修改umask。
3 、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。
4 、重定向孙子进程的标准输入流,标准输出流,标准错误到 / dev / null
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import  sys, os
 
'''将当前进程fork为一个守护进程
    注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了
    所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了
'''
 
def  daemon(stdin = '/dev/null' , stdout = '/dev/null' , stderr = '/dev/null' ):
     # 重定向标准文件描述符(默认情况下定向到/dev/null)  
     try :
         pid  =  os.fork()
         # 父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。  
         if  pid >  0 :
             sys.exit( 0 )   # 父进程退出  
     except  OSError, e:
         sys.stderr.write( "fork #1 failed: (%d) %s\n"  %  (e.errno, e.strerror))
         sys.exit( 1 )
 
         # 从母体环境脱离  
     os.chdir( "/" )   # chdir确认进程不保持任何目录于使用状态,否则不能umount一个文件系统。也可以改变到对于守护程序运行重要的文件所在目录  
     os.umask( 0 )   # 调用umask(0)以便拥有对于写的任何东西的完全控制,因为有时不知道继承了什么样的umask。  
     os.setsid()   # setsid调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。  
 
     # 执行第二次fork  
     try :
         pid  =  os.fork()
         if  pid >  0 :
             sys.exit( 0 )   # 第二个父进程退出  
     except  OSError, e:
         sys.stderr.write( "fork #2 failed: (%d) %s\n"  %  (e.errno, e.strerror))
         sys.exit( 1 )
 
         # 进程已经是守护进程了,重定向标准文件描述符  
 
     for  in  sys.stdout, sys.stderr: f.flush()
     si  =  open (stdin,  'r' )
     so  =  open (stdout,  'a+' )
     se  =  open (stderr,  'a+' )
     os.dup2(si.fileno(), sys.stdin.fileno())   # dup2函数原子化关闭和复制文件描述符  
     os.dup2(so.fileno(), sys.stdout.fileno())
     os.dup2(se.fileno(), sys.stderr.fileno())
 
 
# 示例函数:每秒打印一个数字和时间戳  
def  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' )
     =  0
     while  True :
         sys.stdout.write( '%d: %s\n'  %  (c, time.ctime()))
         sys.stdout.flush()
         =  +  1
         time.sleep( 1 )
 
 
if  __name__  = =  "__main__" :
     daemone( '/dev/null' '/tmp/daemon_stdout.log' '/tmp/daemon_error.log' )
     main()
 
# 可以通过命令ps -ef | grep daemon.py查看后台运行的继承
# 在/tmp/daemon_error.log会记录错误运行日志
# 在/tmp/daemon_stdout.log会记录标准输出日志。

1、fork子进程,父进程退出

通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端盒shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被init进程接管,从而也就脱离了终端控制。

2.修改子进程的工作目录

子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。

3.创建新会话

使用setsid后,子进程就会成为新会话的首进程,子进程会成为新进程组的组长进程,子进程没有控制终端。

4.修改umask

由于umask会屏蔽权限,所有设定为0,这样可以避免读写文件时碰到权限问题

5.fork孙子进程,子进程退出

经过上面几个步骤后,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题,fork孙子进程处理,

6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null

因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到/dev/null,就是丢弃的意思



本文转自 baby神 51CTO博客,原文链接:http://blog.51cto.com/babyshen/1888273,如需转载请自行联系原作者

相关文章
|
8天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
并行计算 安全 Unix
Python教程第8章 | 线程与进程
本章主要讲解了线程与进程的概念,多线程的运用以及Python进程的相关案例学习
36 0
|
1月前
|
分布式计算 并行计算 Java
浅析Python自带的线程池和进程池
浅析Python自带的线程池和进程池
75 0
|
1月前
|
缓存 负载均衡 安全
在Python中,如何使用多线程或多进程来提高程序的性能?
【2月更文挑战第17天】【2月更文挑战第50篇】在Python中,如何使用多线程或多进程来提高程序的性能?
|
25天前
|
安全 Python
Python中的并发编程:多线程与多进程技术探究
本文将深入探讨Python中的并发编程技术,重点介绍多线程和多进程两种并发处理方式的原理、应用场景及优缺点,并结合实例分析如何在Python中实现并发编程,以提高程序的性能和效率。
|
1天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
13 0
|
25天前
|
并行计算 Python
Python中的并发编程:多线程与多进程的比较
在Python编程中,实现并发操作是提升程序性能的重要手段之一。本文将探讨Python中的多线程与多进程两种并发编程方式的优劣及适用场景,帮助读者更好地选择合适的方法来提高程序运行效率。
|
28天前
|
消息中间件 网络协议 API
Python语言的进程通讯及网络
Python语言的进程通讯及网络
|
1月前
|
安全 程序员 数据处理
深入探索Python多进程编程:理论与实践
深入探索Python多进程编程:理论与实践
36 2
|
1月前
|
监控 安全 Linux
Python怎么修改进程名称
Python怎么修改进程名称
29 0