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,如需转载请自行联系原作者

相关文章
|
2月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
7月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
317 0
|
10月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
10月前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
552 1
|
11月前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
11月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
126 3
|
10月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
140 0
|
11月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
154 0
|
11月前
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信
77 0
|
12月前
|
数据采集 Linux 调度
Python之多线程与多进程
Python之多线程与多进程
102 0

热门文章

最新文章

推荐镜像

更多