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. php开发环境配置 web UI模板

    web ui 能快速的整合进来?dwz? easyui?  bootstrap 在Apache 中配置: 在http.conf中加入php的设置 #php5_startphpIniDir " ...

  2. (一)javascript中的数组index属性——获取数组的索引值

    例如:要做到这样的效果 点击每个选项时,会显示不同的div. 我们的做法:在javascript中,先把所有的div的display设置为none,然后在根据当前的数组里的索引值进行一个显示div的过 ...

  3. 【转】如何在Mac上撰寫C++程式

    原文: http://www.macuknow.com/node/4901 本文使用的开发环境:Xcode 5.其实步骤很简单,只需要简单的几步就ok了. 點選Create a new Xcode p ...

  4. 常用免费快递查询API对接案例

    现在许多电商公司和ERP都会寻找比较适用的集成快递查询接口,减少对接难度,现在整理一下常用的免费快递查询接口,并附上调用案例,如果有觉得不对的地方,望能够一起沟通探讨! 一.快递查询接口 目前有提供免 ...

  5. 如何真正免费运营推广APP应用

    随着移动终端的迅速普及,各类APP如雨后春笋般涌现出来,但是真正的运营成功的产品却寥寥无几. 从瓜分渠道资源到抢占用户的过程中,很多同行都明显的感觉到,渠道平台所带来的量日益减少,但是刊例价格却一再攀 ...

  6. Spring-boot使用Ehcache配置

    1.配置类 @Configuration @EnableCaching public class CacheConfiguration {// implements CachingConfigurer ...

  7. 快速集成图片浏览器快速集成图片浏览器->MJPhotoBrowser的使用

    介绍: 一个比较完整的图片浏览器,高仿了新浪微博的图片浏览效果,功能包括:下载浏览互联网图片,点击缩略图全屏显示图片.当加载较大图片时会出现圆形进度条,滑动浏览所有图片.保存图片到本地相册.GIF图片 ...

  8. 命令行界面下用户和组管理之groupmod的使用

    NAME    groupmod - modify a group definition on the system SYNOPSIS       groupmod [options] GROUP O ...

  9. CentOS下modelsim 10.2c install & crack

    install: 1. install is easy to all : run install.linux 2 crack: this section is important: a. instal ...

  10. 盒模型Box Model(浮动)

    一.标准盒模型的大小:border+padding+content(width)        怪异盒模型大小:padding+border   二.display inline  默认,且变为行由内 ...