python下编写守护进程

Python015

python下编写守护进程,第1张

**1、编写守护进程的步骤 **

创建守护进程其实和c创建守护进程的方式大同小异了,其实就是那么几个步骤:

2、定义一个Daemon类,有其他人写好的标准类,可以直接引用

**3、写一个测试的守护进程,每隔两秒向文件中写入数据 **

import os,sys,commands,time

def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):

    """set daemonize """

    try:

        pid = os.fork()

        if pid > 0:

            sys.exit(0)

    except OSError, e:

        sys.stderr.write("fork #1 failed (%d) %s\n " %(e.errno, e.strerror))

        sys.exit(0)

    os.setsid()

    os.chdir('.')

    os.umask(0)

    try:

        pid = os.fork()

        if pid > 0:

            sys.exit(0)

    except OSError, e:

        sys.stderr.write("fork #2 failed (%d) %s\n " %(e.errno, e.strerror))

        sys.exit(0)

    if not stderr: stderr = stdout

    si = file(stdin, "r")

    so = file(stdout, "w+")

    se = file(stderr, "a+")

    pid = str(os.getpid())

    print "start with pid :[%s]" % pid

    fp = open("pid","w")

    print >> fp, pid

    fp.close()

    sys.stderr.flush()

    sys.stdout.flush()

    sys.stderr.flush()

    os.dup2(si.fileno(), sys.stdin.fileno())

    os.dup2(so.fileno(), sys.stdout.fileno())

    os.dup2(se.fileno(), sys.stderr.fileno())

def main():

    daemonize(stdout='test.log', stderr='test.log')

    

    cmd = "ls" 

    while 1:

        (status, ret) = commands.getstatusoutput(cmd)

        print status

        print ret      

        time.sleep(10)

if __name__ == "__main__":

    main()

你可以尝试照这个写写,基本的元素都齐了,后台运行,执行shell命令

不过如果只是想要后台的话,直接shell后台执行一下也就可以了

在python开发中,如何使用supervisor来管理进程呢?Supervisor是什么?Supervisor是如何管理进程的,现在就跟随小编一起来看看使用python的supervisor管理经常的方法。

Supervisor可以启动、停止、重启*nix系统中的程序。也可以重启崩溃的程序。

supervisord的一个守护进程,用于将指定的进程当做子进程来运行。

supervisorctl是一个客户端程序,可以查看日志并通过统一的会话来控制进程。

看例子:

我们写了一个py脚本,用于往log文件中记录一条当前的时间。

[python]view plaincopy

1.root@ubuntu:/home/zoer#catdaemon.py

2.#!/usr/bin/envpython

3.

4.importtime

5.importos

6.time.sleep(1)

7.f=open("log",'a')

8.t=time.time()

9.f.write(str(t))

10.f.write("\n")

11.f.close()

安装过程就不说了。

安装完毕supervisor之后【将配置文件放在/etc下】。修改配置文件,在最后增加如下内容:

[program:ddd]

command=/home/zoer/daemon.py

autorestart=true

然后我们启动supervisor并启动daemon.py的执行。

[python]view plaincopy

1.root@ubuntu:/home/zoer#supervisord

2./usr/local/lib/python2.7/dist-packages/supervisor-3.0b1-py2.7.egg/supervisor/options.py:286:UserWarning:Supervisordisrunningasrootanditissearchingforitsconfigurationfileindefaultlocations(includingitscurrentworkingdirectory)youprobablywanttospecifya"-c"argumentspecifyinganabsolutepathtoaconfigurationfileforimprovedsecurity.

3.'Supervisordisrunningasrootanditissearching'

4.root@ubuntu:/home/zoer#supervisorctl

5.dddSTARTING

6.supervisor>startddd

7.ddd:ERROR(alreadystarted)

8.supervisor>stopddd

9.ddd:stopped

10.supervisor>startddd

11.ddd:started

12.supervisor>

从上面的例子中,看到,可以通过start或者stop命令来启动或者停止ddd这个进程。ddd这里就是我们在配置文件中增加的内容(daemon.py这个脚本)。

也可以使用restart。如下:

supervisor>restart ddd

ddd: stopped

ddd: started

-------------------------------------------------------

下面我们测试一下,假设说我们手动kill掉了ddd这个进程,那么ddd会自动恢复执行吗?

为了做实验,把代码修改如下:

[python]view plaincopy

1.root@ubuntu:/home/zoer#catdaemon.py

2.#!/usr/bin/envpython

3.

4.importtime

5.importos

6.whileTrue:

7.time.sleep(1)

8.f=open("log",'a')

9.t=time.time()

10.f.write(str(t))

11.f.write("\n")

12.f.close()

通过ps可以找到这个进程的id:

[plain]view plaincopy

1.root93540.20.4109244200?S23:160:00python/home/zoer/daemon.py

2.root93950.00.04392832pts/3S+23:170:00grep--color=autodaemon

3.root@ubuntu:/home/zoer#

看下面的操作:

[plain]view plaincopy

1.root@ubuntu:/home/zoer#rmlogtouchlogkill9354

2.root@ubuntu:/home/zoer#catlog

3.1364710712.51

4.root@ubuntu:/home/zoer#catlog

5.1364710712.51

6.1364710713.51

7.root@ubuntu:/home/zoer#catlog

8.1364710712.51

9.1364710713.51

10.root@ubuntu:/home/zoer#catlog

11.1364710712.51

12.1364710713.51

13.1364710714.52

14.root@ubuntu:/home/zoer#catlog

15.1364710712.51

16.1364710713.51

17.1364710714.52

18.1364710715.52

删除了log文件,并且重新创建。然后干掉了daemon.py的那个进程。会发现log内容又重新有新的内容了。再次ps查看进程号。

[plain]view plaincopy

1.root94290.10.4109244200?S23:180:00python/home/zoer/daemon.py

2.root94400.00.04392828pts/3S+23:190:00grep--color=autodaemon

3.root@ubuntu:/home/zoer#

会发现进程号已经变成9429了。说明supervisor已经重启了被干掉了的进程。