为什么子进程无法成功杀死旧的 运行 进程?
Why subprocess can't successfully kill the old running process?
我运行一个程序test.py
。
由于它经常崩溃,我导入subprocess
以在它停止时重新启动它。
有时我发现子进程无法成功重启它。
因此,我强制程序每 60 分钟重新启动一次。
但我发现有时有两个 test.py 处理 运行ning 同时。
我的代码有什么问题以及如何修复它?
我使用 windows 7 OS。
请检查以下代码并提前致谢:
import subprocess
import time
from datetime import datetime
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
minutes = 1
total_time = 0
while True:
now = datetime.now()
#periodly restart
total_time += 1
if total_time % 100 == 0:
try:
p.kill()
except Exception as e:
terminated = True
finally:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
#check and restart if it stops
try:
terminated = p.poll()
except Exception as e:
terminated = True
if terminated:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
time.sleep(minutes * 60)
虽然我完全不同意你的设计,但具体问题在这里:
except Exception as e:
terminated = True
finally:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
在抛出 Exception
的情况下,您将 terminated
设置为 true
,但随后立即重新启动子进程。然后,稍后,您检查:
if terminated:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
此时terminated
是true
,所以它开始了一个新的子进程。但是,它已经在 finally
块中完成了。
真的,你应该做的就是在 kill 尝试期间不要费心重新启动它:
try:
p.kill()
except Exception:
# We don't care, just means it was already dead
pass
finally:
# Either the process is dead, or we just killed it. Either way, need to restart
terminated = True
那么您的 if terminated
子句将正确地重新启动该过程,并且您不会有重复的。
我运行一个程序test.py
。
由于它经常崩溃,我导入subprocess
以在它停止时重新启动它。
有时我发现子进程无法成功重启它。
因此,我强制程序每 60 分钟重新启动一次。
但我发现有时有两个 test.py 处理 运行ning 同时。
我的代码有什么问题以及如何修复它?
我使用 windows 7 OS。
请检查以下代码并提前致谢:
import subprocess
import time
from datetime import datetime
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
minutes = 1
total_time = 0
while True:
now = datetime.now()
#periodly restart
total_time += 1
if total_time % 100 == 0:
try:
p.kill()
except Exception as e:
terminated = True
finally:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
#check and restart if it stops
try:
terminated = p.poll()
except Exception as e:
terminated = True
if terminated:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
time.sleep(minutes * 60)
虽然我完全不同意你的设计,但具体问题在这里:
except Exception as e:
terminated = True
finally:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
在抛出 Exception
的情况下,您将 terminated
设置为 true
,但随后立即重新启动子进程。然后,稍后,您检查:
if terminated:
p = subprocess.Popen(['python.exe', r'D:\test.py'], shell=True)
此时terminated
是true
,所以它开始了一个新的子进程。但是,它已经在 finally
块中完成了。
真的,你应该做的就是在 kill 尝试期间不要费心重新启动它:
try:
p.kill()
except Exception:
# We don't care, just means it was already dead
pass
finally:
# Either the process is dead, or we just killed it. Either way, need to restart
terminated = True
那么您的 if terminated
子句将正确地重新启动该过程,并且您不会有重复的。