python使用fork实现守护进程的方法

  守护进程(Daemon)也称为精灵进程是一种生存期较长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。

他们常常在系统引导装入时启动,在系统关闭时终止。

  os模块中的fork方法可以创建一个子进程。相当于克隆了父进程

os.fork()

子进程运行时,os.fork方法会返回0;

而父进程运行时,os.fork方法会返回子进程的PID号。

所以可以使用PID来区分两个进程:

#!/usr/bin/env python

#coding=utf8

from time import sleep

import os

try:

pid = os.fork()

except OSError, e:

pass

sleep(30)

运行代码,查看进程:

[[email protected] ~]# python test2.py &

[1] 2464

[[email protected] ~]# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 2379 2377 0 80 0 - 28879 wait pts/1 00:00:00 bash

0 S 0 2464 2379 0 80 0 - 31318 poll_s pts/1 00:00:00 python

1 S 0 2465 2464 0 80 0 - 31318 poll_s pts/1 00:00:00 python

0 R 0 2466 2379 0 80 0 - 37227 - pts/1 00:00:00 ps?

简单守护进程例子:

def main():

  ‘‘‘ 程序要执行的逻辑代码 ‘‘‘

  pass

 

 

# 创建守护进程函数

def createDaemon():

  ‘‘‘ 第一块(创建第一个子进程) ‘‘‘

  # fork 第一个子进程(如果fork成功,父进程自杀,只留下第一个子进程继续向下运行)

  try:

    if os.fork() > 0:

      sys.exit(0)

  except OSError, error:

    print ‘(fork第一个子进程失败)fork #1 failed: %d (%s)‘ % (error.errno, error.strerror)

    sys.exit(1)

  ‘‘‘ 第一块结束 ‘‘‘

 

  ###### 第一个进程创建成功后,它的ppid = 1,已是一个守护里程了,但有些功能上还是有被限制。

  ###### 所以下面再来创建一个子进程。第二次创建的子进程限制就没那多了,有可能没有,所以最安全。

  ###### 下面来创建第二个子进程。 

 

 

  os.chdir(‘/‘) # 把第一个子进程的工作目录切换到 / (根目录)

  os.setsid() # 第一个子进程取得程序的权限

  os.umask(0) # 第一个子进程取得工作目录的所有操作(目录的rwx)

 

 

  ‘‘‘ 第二块(创建第二个子进程) ‘‘‘

  # fork 第二个子进程(如果fork成功,第一个子进程自杀,只留下新创建的第二个子进程)

  try:

    pid = os.fork()

    if pid > 0:

      print ‘Daemon PID %d‘ % pid

      sys.exit(0)

  except OSError, error:

    print ‘(fork第二个子进程失败)fork #2 failed: %d (%s)‘ % (error.errno, error.strerror)

    sys.exit(1)

  ‘‘‘ 第二块结束 ‘‘‘

 

 

  ####### 通过上面两个 try 语句块,只留下了第二个子进程在运行了。这时第二个子进程的ppid=1。

  ####### 创建的第二个子进程,可以说是一个不受限的守护进程了。

 

 

 

  # 重定向标准IO(因为只有第二个子进程在运行了,所以也就是指定整个程序的输入、输出、错误流)

   

  # sys.stdout.flush() # 清除程序运行空间的输出流

  # sys.stderr.flush() # 清除程序运行空间的错误流

 

  # inputS = file("/dev/null", ‘r‘)  # 定义一个 inputS 文件对象

  # outputS = file("/dev/null", ‘a+‘) # 定义一个 outputS 文件对象

  # errorS = file("/dev/null", ‘a+‘, 0) # 定义一个 errorS 文件对象

 

  # os.dup2(inputS.fileno(), sys.stdin.fileno()) # 把程序的输入流重定向到上面定义的 inputS 文件对象上。

  # os.dup2(so.fileno(), sys.stdout.fileno()) # 把程序的 输出流 重定向到上面定义的 outputS 文件对象上。

  # os.dup2(se.fileno(), sys.stderr.fileno()) # 把程序的 错误流 重定向到上面定义的 errorS 文件对象上。

 

  main() # main函数为真正程序逻辑代码

 

 

if __name__ == "__main__":

  if platform.system() == "Linux":

      createDaemon()

    else:

      sys.exit()

原文地址:https://www.cnblogs.com/xiaotianxiedaima/p/9801113.html

时间: 2024-08-01 19:59:15

python使用fork实现守护进程的方法的相关文章

[Python网络编程]浅析守护进程后台任务的设计与实现

在做基于B/S应用中,经常有需要后台运行任务的需求,最简单比如发送邮件.在一些如防火墙,WAF等项目中,前台只是为了展示内容与各种参数配置,后台守护进程才是重头戏.所以在防火墙配置页面中可能会经常看到调用cgi,但真正做事的一般并不是cgi,比如说执行关机命令,他们的逻辑如下: (ps:上图所说的前台界面包含通常web开发中的后端,不然也没有socket一说) 为什么要这么设计 你可能疑惑为什么要这么设计,我觉得理由如下: 首先有一点说明,像防火墙等基本上都运行在类Linux平台上 1.安全问题

Python与Hack之守护进程

1.什么是守护进程: 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭.但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程

Python网编_守护进程

假如我有500台机器,跑着500个进程,假如有一部分台机器挂了,我们怎么能及时的知道呢?我们维护自己的机器当然要及时的直到啦so 如果我们有一个监控的软件来实时的监控是不是就可以解决这个问题啦其原理是:client端每隔一个时间段(比如60秒)汇报给server端 没有在正确的时间收到某台机器的汇报就说明这台机器出问题了,应该去看一看.那么如何做呢?在client端的主进程中开启一个子进程,通过这个子进程来汇报,看下面: from multiprocessing import Process i

python学习笔记——守护进程

1 基本描述 守护进程:是系统中独立的后台服务进程, 特点:独立与终端并且周期性地执行某个任务,其生命周期长,一般随系统启动和终止. 缺点:进程的创建和销毁的时候需要消耗较多的计算机资源. 2 参考 Python实现守护进程 python中的daemon守护进程实现方法 python daemon守护进程实现 Python 守护进程 Python如何实现守护进程的方法示例 Python实例浅谈之五Python守护进程和脚本单例运行 原文地址:https://www.cnblogs.com/gen

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

一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,也可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行. Python有时需要保证只运行一个脚本实例,以避免数据的冲突. 二.Python守护进程 1.函数实现 #!/usr/bin/env python #coding: utf-8

Python编写守护进程程序

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

nginx学习十三 初始fork和nginx守护进程ngx_daemon

学习nginx已经有一个多月了,觉得越来越吃力了,主要原因自己总结了一下:1平台是基于linux的,以前几乎没有接触过linux,而nginx使用了很多linux的函数:2就是进程,这个东西接触的也很少,linux的多进程更不用说,而现在正好看到这里,觉得异常的吃力,这不看到nginx守护进程的建立,就找资料好好学习一下,所以本文已学习fork为主要内容. 好了,先看一下nginx的守护进程的建立,然后在学习fork. http://blog.csdn.net/xiaoliangsky/arti

linux 创建守护进程的相关知识

linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关知识,需要的朋友可以参考下 关键字:linux.守护进程 创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到

Daemon守护进程

Daemon守护进程 在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程,都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭. 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务,比