Skip to content

守护脚本:享受7x24小时的不间断下载 #506

@ibaoger

Description

@ibaoger

下面是完整的代码,放在项目根目录中 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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions