繁体   English   中英

如何在 python 程序崩溃后重新启动它

[英]how to restart a python program after it crashes

我有一个 python 脚本,它启动一个程序并通过它自动化,不断处理新数据并保存到预设目录。
永久运行 Python 脚本、在发生错误时记录错误并在崩溃时重新启动的推荐方法是什么?
到目前为止,我遇到了os.execv并开始:

import sys
import os
 
def pyexcept(t, v, tb):
   import traceback
## restarts the script
os.execv( sys.executable, '')

但是我经常在试图弄清楚下一步时遇到困难,有人可以解释我可以采取的下一步吗,ty!

当 python 脚本崩溃时,程序不再运行,因此脚本无法执行更多行代码。

您有 2 个选项:

  1. 确保您的 python 脚本不会崩溃,这是非常推荐的。 您可以通过处理程序抛出的异常来做到这一点。

选项1

我假设您是 python 的新手,所以这里有一个 python 脚本的示例,该脚本处理异常,再次调用相同的 function。

from time import sleep

def run_forever():
    try:
        # Create infinite loop to simulate whatever is running
        # in your program
        while True:
            print("Hello!")
            sleep(10)

            # Simulate an exception which would crash your program
            # if you don't handle it!
            raise Exception("Error simulated!")
    except Exception:
        print("Something crashed your program. Let's restart it")
        run_forever() # Careful.. recursive behavior
        # Recommended to do this instead
        handle_exception()

def handle_exception():
    # code here
    pass

run_forever()
  1. 如果要重新启动 python 脚本,则需要另一个 python 脚本(假设您想使用 python 执行此操作)检查进程是否仍然存在,如果没有,则使用 python 再次运行它。

选项 2

这是通过命令python test.py启动另一个名为“test.py”的 python 脚本的脚本。 确保你有正确的文件路径,如果你把脚本放在同一个文件夹中,你通常不需要完整路径,只需要脚本名称。

值得注意的是,确保您的系统可以识别命令“ python ”,在某些情况下它可以被“python3”识别

script_starter.py

from subprocess import run
from time import sleep

# Path and name to the script you are trying to start
file_path = "test.py" 

restart_timer = 2
def start_script():
    try:
        # Make sure 'python' command is available
        run("python "+file_path, check=True) 
    except:
        # Script crashed, lets restart it!
        handle_crash()

def handle_crash():
    sleep(restart_timer)  # Restarts the script after 2 seconds
    start_script()

start_script()

如果你对我用于测试文件的代码感兴趣:'test.py',我把它贴在这里。

测试.py

from time import sleep
while True:
    sleep(1)
    print("Hello")
    raise Exception("Hello")

不言而喻,如果 Python 脚本崩溃,它就无法自行重启,因为它不再驻留在 memory 中。 那么,答案必须来自 Python 之外的东西,它在比应用程序更低的抽象级别上运行。

Linux 经常用 systemd 解决这个问题。 您可以创建一个描述应用程序运行的单元文件并启动该服务。 systemd 然后将监视正在运行的进程,如果它死了,则重新启动它。

Windows 通常使用 Windows 服务解决此问题,这些服务是带有特殊 win32 API 包装器的可执行文件,以允许系统调用它们以检查它们的状态、停止它们。 NSSM (非吸吮服务管理器)是一个有用的实用程序,可以从任意命令创建服务。

您必须使用一些外部服务来观看您的 python 应用程序。 在 windows 中,您可以使用ZAEA23489CE3AA9B6406EBB28EZCDA将 python 应用程序作为 windows 服务运行

Windows 服务包装器 (WinSW) 最初是为在 ZAEA23489CE3AA9B6406EBB24 机器中作为 Windows 服务运行 Jenkins 客户端和服务器而开发的。 但与其他服务包装器不同的是,WinSW 允许您运行任何其他应用程序,例如 python。

您可以将所有配置详细信息作为 XML 文件提供。

您可能感兴趣的一些配置

  • executable ->您可以定义要运行的可执行文件( python在您的情况下)
  • 参数 --> 您可以为可执行文件提供aruments (例如 - 您可以提供您的应用程序)
  • onFailure --> 您可以使用onfailure配置来指定应用程序失败时要执行的操作。
  • logpath --> 您可以指定日志的位置。

还有很多。 请阅读文件以了解所有配置。

您应该将配置 XML 文件放在 WinSW 可执行文件所在的同一目录中。 还有一些必须实现的配置需要管理 windows 服务( idnamedescriptionexecutable )。

您可以从此链接下载最新版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM