import os
import sys
from time import sleep
try:
pid = os.fork()
if pid > 0: sys.exit(0) # Exit parent.
pid = os.fork()

    os.setsid()
    os.chdir(self.curdir)
    os.umask(022) if pid > 0: sys.exit(0) # Exit parent.
except OSError, e:
sys.stderr.write("fork failed: (%d) %s\n" % (e.errno, e.strerror))
sys.exit(1) while 1:
sleep(1)

fork用户将当前进程分叉,即新建一个子进程,这样,运行完pid=os.fork()这条语句后,就有两个进程,这两个进程都会独自运行下面的代码,同时每个进程都有一个pid,子线程的pid为0

派生一个守护进程后,通过while来实现该进程一直在后台运行

.ps -ajx 参数说明:ppid 父进程id,pid 进程id,pgid 进程组id,sid 会话期id
 
一个进程组包含多个进程,一个会话期包含多个进程组,一个会话期拥有一个终端,
如果在该终端输入退出(ctrl+c)命令,将关闭改会话期包含的所以进程
 
创建守护进程步骤
目的:使子进程不会拥有控制终端,即不要继承父进程的进程组id和会话组id,也就是使子进程成为进程组组长和会话组组长
1.创建子进程。fork产生子进程,由于有父进程,所以该子进程不会是进程组组长和会话期组长
2.脱离控制终端。通过setid方法,使子进程成为 新的会话期 组长,由于该会话期只有一个进程,所以该子进程也是进程组组长。这是改会话期组长是没有可控制终端的
3.禁止进程重新打开控制终端 。现在,进程已经成为无终端的会话组长,但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
4.关闭打开的文件描述符
5.改变当前工作目录
6.重设文件创建掩码
7.从子进程中fork另一个子进程,该子进程不是进程组组长,也不是会话期组长,是真正的守护进程
 
为了更好地观察创建守护进程中,各种身份的变化,在这里做一个测试
测试代码:
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com' import os
import sys
from time import sleep
try: pid = os.fork()
print '完成第一次fork'
sleep(10) #sleep1
if pid > 0: sys.exit(0) # Exit first parent. os.setsid()
print '执行setsid,使子进程成为会话期组长'
sleep(10) #sleep2 os.chdir('/')
os.umask(022) #设置当前权限掩码,同时返回先前的权限掩码。
print '完成修改工作目录和权限掩码'
sleep(10) #sleep3 pid = os.fork()
print '完成第二次fork'
sleep(10) #sleep4
if pid > 0: sys.exit(0) # Exit first parent. print '守护进程启动完成'
sleep(10) #sleep5
except OSError, e:
sys.stderr.write("fork failed: (%d) %s\n" % (e.errno, e.strerror))
sys.exit(1) while 1:
sleep(1)

这里一共有5个sleep,我在每个sleep都用ps -axj|grep python命令查看进程的id变化,分别为:
标题头:

父进程id  进程id  进程组id  会话期id

进程组或会话期的id与该进程组或会话期的组长的进程id相同

例如进程id是7000的进程,它的进程组id是6000,即7000所属的进程组的id是6000,该进程组的组长是进程id为6000的进程,会话期同理

sleep1:

第一个进程为父进程,第二个为子进程,他们有共同的进程组id和会话期id

 sleep2:
父进程退出,剩下子进程,通过setsid命令,使子进程成为进程组组长和会话期组长
 sleep3:
这个步骤id不会变化
sleep4:
子进程再fork一个子进程,之前的子进程变成父进程,父进程与子进程拥有共同的进程组id和会话期id,
 sleep5:
父进程退出,子进程既不是进程组组长也不是会话期组长,子进程与第一个父进程完全脱离关系,子进程没有控制终端,达到守护进程需要的条件
 

参考资料:http://www.01happy.com/python-fork-create-process/

http://blog.csdn.net/mr_jj_lian/article/details/7252222

Python 守护进程的更多相关文章

  1. python 守护进程 daemon

    python 守护进程 daemon # -*-coding:utf-8-*- import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这 ...

  2. Python守护进程和脚本单例运行

    Python 守护进程 守护进程简介 进程运行有时候需要脱离当前运行环境,尤其是Linux和Unix环境中需要脱离Terminal运行,这个时候就要用到守护进程.守护进程可以脱离当前环境要素来执行,这 ...

  3. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  4. Python守护进程(多线程开发)

    本段代码主要作用是httpsqs队列的消费端守护进程,从httpsqs中取出数据,放入mongodb #!/usr/bin/python import sys,time,json,logging im ...

  5. python守护进程

    1.守护进程 [1]使用runner这个模块直接创建守护进程,非常方便. [2]运行方法:python xxx.py start|stop|restart [3]调用python xxx.py sto ...

  6. python 守护进程、同步锁、信号量、事件、进程通信Queue

    一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...

  7. Python—守护进程管理工具(Supervisor)

    一.前言简介 1.Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.可以很方便的用来启动.重启.关闭进程(不仅仅是 ...

  8. 041.Python守护进程,锁信号量和事件

    一 守护进程 1.1 基本概念 守护进程 正常情况下,主进程默认等待子进程调用结束之后结束 守护进程在主进程执行代码结束后,自动终止 守护进程语法: 进程对象.daemon = True ,设置该进程 ...

  9. python 守护进程,监控进程

    守护进程代码: import time, os import subprocess def run(): while True: taskList = os.popen('tasklist').rea ...

随机推荐

  1. Linux性能优化--CPU[备忘]

    http://kumu-linux.github.io/blog/2014/04/21/performance-cpu/

  2. careercup-C和C++ 13.5

    13.5 谈谈C语言关键字”volatile”的意义(或重要性)? 解答 关键字volatile的作用是指示编译器,即使代码不对变量做任何改动,该变量的值仍可能被外界修改.操作系统.硬件或其他线程都可 ...

  3. java_jdbc_可变参数_MetaData

    异常处理参考3层解耦 ublic class ScrollTest { public static void main(String[] args) throws SQLException { // ...

  4. Apache rewrite 详解

    用rewrite可实现的部分:URL根目录搬迁,多目录查找资源,阻止盗连你的图片,拒绝某些主机访问,基于时间重写,据浏览器类型重写,动态镜像远程资源,外部重写程序模板,等等 详见下表: 目标 重写设置 ...

  5. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  6. 圆满完成平安科技Web安全与App应用安全测试培训!

    圆满完成平安科技Web安全与App应用安全测试培训!

  7. c++ 拷贝构造练习

    #include<iostream> using namespace std; class Vector { private: int *dwp; int size; void clone ...

  8. jquery用on代替bind(),live(),delegate()的方法

    Js的功能确实非常强大,奈何我一个php程序员一直在js上没有投入足够的精力去研究,每次遇到不会的都是去百度,以后有时间真的应该买本书系统的学习一下 // Bind $( "#members ...

  9. 어느 도시 보유 하 면 사랑 이다(事態が発生すれば、ある都市の恋はしません)【Si les villes un amour】{If have love in a city}

    如果在北京拥有爱情 半夜在簋街喝啤酒 吃小龙虾 在后海的苦情歌声里 搂着你数那四合院的瓦片 如果在上海拥有爱情 去外滩手挽手 吹吹风 坐一下午 去城隍庙尝试各种小吃 嘲笑你嘴角残余的糯米糕 如果在杭州 ...

  10. System.Data.SqlClient.SqlError: 对文件……的目录查找失败[转]

    System.Data.SqlClient.SqlError: 对文件……的目录查找失败,出现操作系统错误 3 的处理办法 在还原SQL SERVER数据库时出现了查找目录失败的原因,困扰了我一个多小 ...