-
-
Notifications
You must be signed in to change notification settings - Fork 391
Open
Description
下面是完整的代码,放在项目根目录中 auto_restart.py,使用 python auto_restart.py 启动即可享受7x24小时的不间断下载
#!/usr/bin/env python
"""
自动重启 media_downloader.py 脚本,当检测到连接丢失时
"""
import subprocess
import time
import sys
import os
import signal
def run_media_downloader():
"""
运行 media_downloader.py 并监控其输出
当检测到 "Connection lost" 时重启它
"""
print("启动 media_downloader.py...")
# 设置子进程启动配置
process = subprocess.Popen(
["python", "media_downloader.py"],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, # 合并标准错误到标准输出
universal_newlines=True, # 使用文本模式获取输出
bufsize=1 # 行缓冲
)
# 监控输出
try:
while process.poll() is None: # 当进程还在运行时
line = process.stdout.readline()
if not line:
break
print(line, end='') # 输出子进程的日志
# 检查是否包含 "OSError"
if "OSError" in line:
print("\n检测到连接丢失,正在重启...")
# 终止进程
process.terminate()
try:
process.wait(timeout=5) # 等待进程终止
except subprocess.TimeoutExpired:
process.kill() # 如果进程没有及时终止,强制终止
# 等待一段时间再重启
time.sleep(2)
return False # 返回 False 表示需要重启
except KeyboardInterrupt:
print("\n检测到 Ctrl+C,正在优雅地终止...")
process.terminate()
try:
process.wait(timeout=5)
except subprocess.TimeoutExpired:
process.kill()
return True # 返回 True 表示正常退出
# 如果进程自然退出,检查退出码
exit_code = process.returncode
print(f"media_downloader.py 已退出,退出码: {exit_code}")
# 如果是非正常退出,我们也重启
if exit_code != 0:
print("非正常退出,准备重启...")
time.sleep(2)
return False
return True # 正常退出,不需要重启
def main():
"""主函数"""
print("启动自动重启监控程序...")
while True:
should_exit = run_media_downloader()
if should_exit:
break
print("重新启动 media_downloader.py...")
if __name__ == "__main__":
main()
Metadata
Metadata
Assignees
Labels
No labels