**1、编写守护进程的步骤 **
创建守护进程其实和c创建守护进程的方式大同小异了,其实就是那么几个步骤:
2、定义一个Daemon类,有其他人写好的标准类,可以直接引用
**3、写一个测试的守护进程,每隔两秒向文件中写入数据 **
import os,sys,commands,timedef 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已经重启了被干掉了的进程。