python daemon守护进程实现_python

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。
守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就是表示daemon的意思。

守护进程的编写步骤:

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

#!/usr/bin/env python
#coding=utf8
def createDaemon():
  import os, sys, time
  #产生子进程,而后父进程退出
  try:
    pid = os.fork()
    if pid > 0:sys.exit(0)
  except OSError,error:
    print 'fork'
    sys.exit(1)

  #修改子进程工作目录
  os.chdir("/")
  #创建新的会话,子进程成为会话的首进程
  os.setsid()
  #修改工作目录的umask
  os.umask(0)

  #创建孙子进程,而后子进程退出
  try:
    pid = os.fork()
    if pid > 0:
      print "Daemon PID %d"%pid
      sys.exit(0)
  except OSError,error:
    print "fork"
    sys.exit(1)
  run()

def ping():
  import os
  os.system('ping www.baidu.com >/dev/nul')

def run():
  while True:
    import time,threading
    fd = open('/home/ping.log', 'a')
    fd.write("start time---------:%s\n"%time.ctime())
    fd.flush()
    t=threading.Thread(target=ping,args=())
    t.start()
    time.sleep(3)
    fd.write("end of time--------:%s\n"%time.ctime())
    fd.flush()
  fd.close()

if __name__=='__main__':
  createDaemon()

1、fork子进程,父进程退出
通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端盒shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被init进程接管,从而也就脱离了终端控制。
2.修改子进程的工作目录
子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。
3.创建新会话
使用setsid后,子进程就会成为新会话的首进程,子进程会成为新进程组的组长进程,子进程没有控制终端。
4.修改umask
由于umask会屏蔽权限,所有设定为0,这样可以避免读写文件时碰到权限问题
5.fork孙子进程,子进程退出
经过上面几个步骤后,子进程会成为新的进程组老大,可以重新申请打开终端,为了避免这个问题,fork孙子进程处理,
6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null
因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到/dev/null,就是丢弃的意思

我们来运行一个这个程序,看看效果

从上图可以看出这个脚本程序已经放入后台,只能使用killall方式来结束掉,
接下来我们去看下记录的日志

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
守护进程
daemon守护进程、python daemon进程、python 多进程 daemon、python 守护进程、python 进程守护脚本,以便于您获取更多的相关知识。

时间: 2024-09-30 22:17:23

python daemon守护进程实现_python的相关文章

使用Python编写Linux系统守护进程实例_python

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下.守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行.–维基百科 守护进程区别于普通用户登陆系统后运行的进程,它是直接由系统初始化,和系统用户没有关系,而用户开启的进程依存与用

python:守护进程deamon

一.守护进程的基本编码规范     详细参见:<AdvancedProgrammingin The Unix Environment>Section 13.3 Page 583      本小节将介绍一些守护进程的基本编码规范,这些规范将阻止守护进程与当前环境产生一些不必要的交互.本节将通过一个函数daemonize实现这些规范.     1. 首先要做的被称为 umask,这一步骤会将文件创建掩码重置为0.这一步的原因是守护进程继承(inherited)得到的文件掩码有可能会拒绝某些特定的文

怎样利用Python制作守护进程

有时候我们的需要制作一些守护进程,如果服务器出现了什么问题,就需要重启某个软件啊之类的 那么这类守护进程怎么做呢? 请看代码   import time seconds_to_sleep = 2 * 60 while 1:        #这里你可以利用python的shell做一些系统操作                  print "Hello David, guard process is running ... "            time.sleep( seconds

linux下daemon守护进程的实现(以nginx代码为例)

ngx_int_t ngx_daemon(ngx_log_t *log) { int fd; // 让init进程成为新产生进程的父进程: // 调用fork函数创建子进程后,使父进程立即退出.这样,产生的子进程将变成孤儿进程,并被init进程接管, // 同时,所产生的新进程将变为在后台运行. switch (fork()) { case -1: ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); return

Python守护进程(daemon)代码实例_python

# -*-coding:utf-8-*- import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有 chdir() 和 umask()了 ''' def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'): '''Fork当前进程为守护进程,重定向标准文件描述符 (

Python实现Linux下守护进程的编写方法_python

本文实例讲述了Python实现Linux下守护进程的编写方法,分享给大家供大家参考,相信对于大家的Python程序设计会起到一定的帮助作用.具体方法如下: 1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的命令行或shell程序.需要这一步以便保证新进程不是一个进程组头领进程(process group leader).下一步,'setsid()',会因为你是进程组头领进程而失败.进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同.子进程从父进程继

如何写php守护进程(Daemon)_php技巧

守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.php也可以实现守护进程的功能.一.基本概念进程: 每个进程都有一个父进程,子进程退出,父进程能得到子进程退出的状态.进程组:每个进程都属于一个进程组,每个进程组都有一个进程组号,该号等于该进程组组长的PID二.守护编程要点1. 在后台运行               为避免挂起控制终端将Daemon放入后台执行.方法是在进程中调用fork使父进程终止

如何使用nodejs实现守护进程

写一个一直运行永远不挂掉的程序是一件很难的事儿,至少一次性写成很难.但是为了不因为程序挂掉而耽误时间我们往往需要一个守护进程来看着程序是否挂掉,如果挂掉那么将程序重启,重启的同时还要收集挂掉的原因,这样我们的程序才会越来越健壮. 今天我遇到了这样的问题,如下是我使用nodejs实现的一个守护进程, var spawn = require('child_process').spawn; function start(){ nw = spawn('./nw', ['book']); nw.on('c

TimesTen学习(四)Data Manager守护进程

<TimesTen学习(一)安装篇>http://blog.itpub.net/23135684/viewspace-717741/<TimesTen学习(二)连接创建第一个数据库>http://blog.itpub.net/23135684/viewspace-1189880/<TimesTen学习(三)远程连接TimesTen数据库>http://blog.itpub.net/23135684/viewspace-1190342/这篇文章将重点讨论一下Data Ma