编写了一个服务端程序,打开终端能直接运行程序,但是这样终端就被限制住了。如果ctrl+c退出或者关闭终端,那么服务端程序就会退出。于是就想着让这个服务端程序成为守护进程,像httpd、vsftpd、mysqld一样,一直在后端运行,不会受终端的影响。

守护进程英文为daemon,像httpd、mysqld、vsftpd最后个字母d其实就是表示daemon的意思。

守护进程的编写步骤:

fork子进程,而后父进程退出,此时子进程会被init进程接管。修改子进程的工作目录、创建新进程组和新会话、修改umask。
子进程再次fork一个进程,这个进程可以称为孙子进程,而后子进程退出。重定向孙子进程的标准输入流、标准输出流、标准错误流到/dev/null。
完成上面的4个步骤,那么最终的孙子进程就称为守护进程。先看下代码,后面再分析下每个步骤的原因。

#!/usr/bin/env python
#coding=utf8import os, sys, time#产生子进程,而后父进程退出
pid = os.fork()
if pid > 0:sys.exit(0)#修改子进程工作目录
os.chdir("/")
#创建新的会话,子进程成为会话的首进程
os.setsid()
#修改工作目录的umask
os.umask(0)#创建孙子进程,而后子进程退出
pid = os.fork()
if pid > 0:sys.exit(0)#重定向标准输入流、标准输出流、标准错误
sys.stdout.flush()
sys.stderr.flush()
si = file("/dev/null", 'r')
so = file("/dev/null", 'a+')
se = file("/dev/null", 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())#孙子进程的程序内容
while True:time.sleep(10)f = open('/home/test.txt', 'a')f.write('hello')

上面的程序没有任何错误处理,但是不影响原理分析。如果要应用到项目里,还需完善。下面笔者谈下自己对每个步骤的理解。

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

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

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

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

3、创建新会话

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

4、修改umask

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

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

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

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

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

python deamon example相关推荐

  1. sparkpython效率低_Effective PySpark(PySpark 常见问题)

    构建PySpark环境 首先确保安装了python 2.7 ,强烈建议你使用Virtualenv方便python环境的管理.之后通过pip 安装pyspark pip install pyspark ...

  2. MLSQL:融合 Spark+Ray,让企业低成本落地 Data+AI

    近日由 Kyligence 主办的 Data & Cloud Summit 2021 行业峰会在上海成功举办,此次峰会特设「开源有道」分论坛,邀请了来自 Apache Kylin,Apache ...

  3. python实现DEAMON守护进程

    1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端 ...

  4. python多进程_Python多进程实践

    本文重点探究以下几个内容: 创建进程Process 进程间数据传递Queue/Pipe/Value/Array/Manager 进程池Pool 创建进程Process 创建进程方式如下: 可以看出,P ...

  5. python多进程原理_python多进程的详细介绍(附示例)

    本篇文章给大家带来的内容是关于PHP中的SAPI是什么?如何实现?(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 进程 Python是运行在解释器中的语言,查找资料知道,py ...

  6. python实用程序育儿法_Python多线程 简明例子

    Python多线程 简明例子 (2010-03-11 15:15:09) Python多线程 简明例子 综述 多线程是程序设计中的一个重要方面,尤其是在服务器Deamon程序方面.无论何种系统,线程调 ...

  7. 11.python并发入门(part9 多进程模块multiprocessing基本用法)

    一.回顾多继承的概念. 由于GIL(全局解释器锁)的存在,在python中无法实现真正的多线程(一个进程里的多个线程无法在cpu上并行执行),如果想充分的利用cpu的资源,在python中需要使用进程 ...

  8. 【Python】轻量级分布式任务调度系统-RQ

    一 前言       Redis Queue 一款轻量级的P分布式异步任务队列,基于Redis作为broker,将任务存到redis里面,然后在后台执行指定的Job.就目前而言有三套成熟的工具cele ...

  9. python多线程和多进程的使用_python多线程与多进程

    python多线程与多进程 python多线程 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来 ...

  10. python 并行计算 multiprocessing、multiprocess模块 简介

    目录 多进程才是真·并行 multiprocessing模块 1.创建子进程 2.进程间通信--数据共享 3.进程间通信--数据传递 4.锁(同步原语) 5.其他重要函数 multiprocess模块 ...

最新文章

  1. 手机APP功能测试经验分享2016.06.06
  2. 使用Java反射更改私有静态最终字段
  3. Java使用PDFBox开发包实现对PDF文档内容编辑与保存
  4. 电脑设置 win10 文件夹如何设置黑色描边?文件夹图片如何显示缩略图?
  5. Spring AOP (事务管理)
  6. 如果我用你待我的方式来待你 恐怕你早已离去
  7. Linux --- 常用命令
  8. 微信小程序开发入门介绍-布局组件
  9. jsMind 使用直角画线
  10. psql中character varying和character区别
  11. 一阶电路误差分析_自动控制原理 | 时域分析法
  12. 用非门74HC04与无源晶振产生时钟信号的两种电路
  13. C语言循环语句——while、for、do while
  14. SM1算法的EBC、CBC、OFB模式及其介绍
  15. 蓝桥ROS机器人之古月居ROS入门21讲
  16. 安装rpm 树莓派4_树莓派|在树莓派中开启激动人心的 Perl 之旅
  17. 机器视觉-相机镜头光源介绍及选型-12.系统选型
  18. html编码心形,CSS3心形效果代码
  19. linux没有tcpdump命令,大神教你在Linux中使用tcpdump命令
  20. 使用ISO文件制作启动盘

热门文章

  1. 华为android手机root,华为手机root权限获取教程
  2. SDAU信息学院LaTeX模板使用指南
  3. 如何获取win10用户最高权限
  4. java 实验室预约系统_基于Java的实验室预约管理系统
  5. Ucenter实现多个网站同步登录
  6. 毕业设计-基于SpringBoot体育运动场馆管理系统+开题报告-任务书等
  7. chainlink2022年春季编程马拉松
  8. 加息 75 个基点落地,市场短暂宣泄后前路依旧黯淡?
  9. 陕西省本级城镇企业退休人员 - 人脸识别APP资格认证操作指南
  10. CNI插件之bridge plugin