Python Linux - Is-Alive Midori Watchdog
Я пытаюсь реализовать сторожевой таймер, который будет пинговать хост, если он работает, то он получит midori, чтобы открыть удаленную страницу, если нет, то он откроет локальную страницу.
Я адаптировал это из кода здесь: https://raspberrypi.stackexchange.com/questions/6981/auto-refresh-for-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
1 ответ
Вызов подпроцесса ожидает завершения команды.
Такое ощущение, что звонки мидори не возвращаются. Что будет делать мидори, когда ее призовут? Будет ли он автоматически закрываться через некоторое время и, таким образом, вернуть поток к коду Python?
Попробуйте выполнить:
sub.call(["midori", "-a", "localhost:888","-e","Fullscreen"])
в интерпретаторе Python и проверьте, возвращается ли он.
Если он не возвращается, вы должны попробовать Popen из модуля подпроцесса. Упакуйте материал midori в конструкцию Popen, (возможно) дождитесь некоторого конкретного вывода и конца midori (или оставьте его в силе, если вы можете передать новые URL работающему midori).