![](/img/trans.png)
[英]How to restart a DiscordBot Program after it crashes or exits with a error code?
[英]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 个选项:
我假设您是 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()
这是通过命令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 服务( id
、 name
、 description
、 executable
)。
您可以从此链接下载最新版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.