PythonLinux是活的Midori看门狗

PythonLinux是活的Midori看门狗,python,linux,midori,Python,Linux,Midori,我正在尝试实现一个看门狗,它将ping一个主机,如果它启动了,那么它将让midori打开远程页面,如果没有,那么它将打开一个本地页面 我已根据此处的代码对其进行了改编: 问题在于,对于每种情况,它似乎只工作一次,例如,如果远程站点已启动,则显示远程页面,当它关闭时,显示本地页面,但当远程站点再次启动时,midori不会加载页面 我已经禁用了midori调用,只输出了up和last vars,它们是正确的,if条件执行正确,所以看起来它与popen和sub.calls相关 关于这个问题有什么想法吗

我正在尝试实现一个看门狗,它将ping一个主机,如果它启动了,那么它将让midori打开远程页面,如果没有,那么它将打开一个本地页面

我已根据此处的代码对其进行了改编:

问题在于,对于每种情况,它似乎只工作一次,例如,如果远程站点已启动,则显示远程页面,当它关闭时,显示本地页面,但当远程站点再次启动时,midori不会加载页面

我已经禁用了midori调用,只输出了up和last vars,它们是正确的,if条件执行正确,所以看起来它与popen和sub.calls相关

关于这个问题有什么想法吗

#!/usr/bin/env python
host = "localhost"
port = 888
recheck_time = 10
page_to_open_to = "/"
lurl = "///usr/share/scripts/splash.htm"
last = -1 #undefined state
up = -1 #Undefined state

import subprocess as sub
from time import sleep
import socket
import threading

sub.Popen(["midori", "-a","localhost:888","-e","Fullscreen"]) #open midori

#Check if internet is up
addr = (host, port) #the connection addr

while True:
    last = up #reset checking var
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #create socket
    try: #attempt to ping, change vars
        s.connect(addr)
        up = 1

    except socket.error:
        up = 0 

    if up == 1 and last == 0:
        sub.call(["midori", "-a", "localhost:888","-e","Fullscreen"])
        print('up')

    elif up == 0 and last == 1:
        sub.call(["midori", "-a",lurl,"-e","Fullscreen"])
        print("down")

    s.close()

    print(up,",",last)
    sleep(recheck_time)
似乎每次调用sub.call()时,都会启动一个新进程,直到有2个进程,然后什么也没有:

root      3499  0.3  0.5  10792  5856 tty1     S    17:44   0:00 /usr/bin/python /usr/share/scripts/midori.py
root      3500  3.3  4.7 191620 48240 tty1     Sl   17:44   0:03 midori -a localhost:888 -e Fullscreen
root      3530  1.0  2.8 173732 28836 tty1     Sl   17:45   0:00 midori -a ///usr/share/scripts/splash.htm
等待命令完成

所以感觉midori的电话没有回了。midori被召唤后会做什么?它是否会在一段时间后自动关闭,从而将流返回到Python代码

尝试执行以下命令:

sub.call(["midori", "-a", "localhost:888","-e","Fullscreen"])
在Python解释器中,检查它是否返回


如果它没有返回,您应该尝试从子流程模块返回。将midori内容打包到Popen构造中,(可能)等待某些特定的输出和结束midori(或者如果可以将新URL传递给正在运行的midori,则保持其活动状态)。

谢谢,我尝试从解释器中调用它,看起来新的进程已经开始。如果我再次调用它,则不会返回任何内容。您是否意识到在给定的示例中,只有-e参数被传递给midori的子进程调用?也许这会有所不同。