0

ホストに ping を実行するウォッチドッグを実装しようとしています。稼働している場合は midori にリモート ページを開き、そうでない場合はローカル ページを開きます。

ここのコードからこれを適応させました: https://raspberrypi.stackexchange.com/questions/6981/auto-refresh-for-midori

問題は、条件ごとに 1 回しか機能しないように見えることです。たとえば、リモート サイトが起動している場合はリモート ページが表示され、ダウンしている場合はローカル ページが表示されますが、リモート サイトが再び起動すると midori が表示されます。ページをロードしません。

midori 呼び出しを無効にして、up 変数と last 変数を出力したところ、それらは正しく、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
4

1 に答える 1

0

サブプロセス呼び出しは、コマンドが完了するのを待ちます。

ということで、みどりコールが返ってこない感じです。呼ばれたらみどりはどうする?しばらくすると自動的に閉じて、フローを Python コードに戻しますか?

以下を実行してみてください:

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

Python インタープリター内で、それが返されるかどうかを確認します。

返されない場合は、subprocess モジュールのPopenを試してください。midori のものを Popen コンストラクトにパックし、(おそらく) いくつかの特定の出力と end midori を待ちます (または、実行中の midori に新しい URL を渡すことができる場合は、それを維持します)。

于 2013-09-05T09:13:39.473 に答える