2009-05-21 83 views
3

我有2个服务器程序,必须使用GNU屏幕启动。我希望通过基于Python的程序来强化这些服务器以防止崩溃,该程序会启动每个屏幕会话,然后监视服务器进程。如果服务器进程崩溃,我需要python代码来杀死多余的屏幕会话并再次使用屏幕重新启动服务器。python中的多服务器监视器/自动重启器

我对python很陌生,但我利用这个机会来教导自己。我知道这可以在bash脚本中完成。但是我想为未来的功能构建这个代码,所以它只需要python。

的伪代码如下:

thread-one { 
    While 1: 
    start server 1 using screen 
    wait for server to end 
    end while 
} 

thread-two { 
    While 1: 
    start server 2 using screen 
    wait for server to end 
    end while 
} 
+0

这些实际上是线程吗?或者他们是儿童进程? – 2009-05-21 19:00:33

+0

python脚本(我认为)需要多线程来独立处理两个独立程序的重新启动。所以它们是独立启动子进程的线程。 – Caedis 2009-05-21 19:07:32

回答

5

“必须是多线程处理的两个单独的程序重启”

不明白为什么。

import subprocess 

commands = [ ["p1"], ["p2"] ] 
programs = [ subprocess.Popen(c) for c in commands ] 
while True: 
    for i in range(len(programs)): 
     if programs[i].returncode is None: 
      continue # still running 
     else: 
      # restart this one 
      programs[i]= subprocess.Popen(commands[i]) 
     time.sleep(1.0) 
3

你真的不应该在屏幕上运行的制作软件。如果服务器重新启动,您将如何启动它?手动? 另外我认为你正试图重新发明车轮。已经有相当不错的工具可以完成您需要的工作。

launchtool可以运行一个 用户提供的命令在许多方面监督其 执行,如 控制其环境,阻断 信号,记录其输出,改变 用户和组权限,限制 资源使用,如果 失败,则重新启动它,连续运行它, 将其变成守护程序等等。

Monit是一个免费的开源 实用程序在UNIX系统上管理和监控, 进程,文件,目录和文件系统 。 Monit 进行自动维护和 修复,并可以在错误情况下执行有意义的 因果操作。

+0

虽然我的客户正在使用该服务器,但这不是关键任务,它是一个非商业用途的测试服务器。服务器程序尽管很重要,但不会杀死任何人,或者如果他们死亡就会花费任何钱。这个练习的主要目的是创建一个有用的程序,我可以在学习python的同时扩展它。当我需要满足时,我发现我学得最好。有可能是应用程序来做到这一点,但是这打破了目的。 – Caedis 2009-05-21 19:30:11