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. java 并发官方教程

    http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Concurrency Computer users t ...

  2. java编程思想第四版中net.mindview.util包

    把 net那个包 放入到你编写的项目同一个文件夹下(与src文件夹平级的那个),然后刷新一下工程即可

  3. 大陆居民身份证验证方法(java)

    1.设置接口 @Constraint(validatedBy = ChineseIdNumberValidator.class) @Target({ElementType.METHOD, Elemen ...

  4. ssh用root直接登录失败的问题

    解决方法: 1) 以root身份,chmod +w /etc/ssh/sshd_config 2) vi /etc/ssh/sshd_config 3) 将PermitRootLogin no改成Pe ...

  5. MSBuild编译扩展

    新增一个C#工程,用记事本打开工程文件(.csproj结尾),滚动条拉到最后,大家可以看到一段如下的代码,其中<Target Name="BeforeBuild">和& ...

  6. 关于Collections中的sort()方法总结

    用Java集合中的Collections.sort方法对list排序的两种方法 本文部分引用自:http://my.oschina.net/leoson/blog/131904 用Collection ...

  7. css扁平化博客学习总结(四)content代码实现

    1.根据功能,把不同的部分写出来,方便扩展 <div class="content"><!-- 内容开始 --> <section class=&qu ...

  8. RabbitMQ 原文译04--路由

    在前一篇文章中我们构建了一个简单的日志系统,我们可以向多个接受者广播消息. 在这篇文章我,我们将要添加一些功能使得针对部分消息的接受成为可能,例如我们只对错误的消息进行磁盘记录,同时又可以把所有的消息 ...

  9. jenkins离线安装git插件

    jenkins没有默认安装git,当jenkins无法连接外网的话,安装git插件就是一件很麻烦的事,需要自己去下载插件: 往下拉 这边的插件就是需要自己去下载了,在bing下搜索jenkins gi ...

  10. SecureCRT自动断开连接的问题

    直接在虚拟机上ssh道实验室的服务器时并没有发现过上一段时间不操作就会断开,可能是我没有注意,也能是操作时间间隔比较短. 但是在secureCRT上登录时,发现经常的断开,很是郁闷,所以baidu了一 ...