首页 > 系统相关 >Python被远程主机强制关闭后怎么自动重新运行进程

Python被远程主机强制关闭后怎么自动重新运行进程

时间:2024-08-21 22:15:51浏览次数:6  
标签:主程序 supervisor Python 主机 重试 program main 远程

要实现Python程序在被远程主机强制关闭后能够自动重新运行,我们可以采用几种方法,但最直接且常用的方法之一是结合操作系统级的工具或脚本。在Linux系统中,我们可以使用cron作业或者systemd服务来实现这一功能;在Windows系统中,可以使用任务计划程序。但在这里,为了提供一个跨平台的、更灵活的解决方案,我们可以编写一个简单的Python脚本来监控主程序,并在检测到主程序被关闭后重新启动它。

1.使用了Python的subprocess模块来启动和监控主程序示例

1.1脚本的示例

以下是一个Python脚本的示例,该脚本将监控另一个Python程序(例如main_program.py)的运行状态,并在它退出时重新启动它。这个监控脚本使用了Python的subprocess模块来启动和监控主程序,以及time.sleep来周期性检查主程序是否还在运行。

import subprocess  
import time  
  
def run_main_program():  
    # 启动主程序  
    print("Starting main_program.py...")  
    try:  
        # 使用subprocess.Popen启动主程序,确保可以捕获其PID  
        process = subprocess.Popen(['python', 'main_program.py'])  
        # 等待主程序结束  
        process.wait()  
        print("main_program.py has exited. Restarting...")  
    except Exception as e:  
        print(f"An error occurred: {e}. Trying to restart main_program.py...")  
  
if __name__ == "__main__":  
    while True:  
        run_main_program()  
        # 等待一段时间后再重新启动(例如每5分钟)  
        time.sleep(300)  # 300秒 = 5分钟  
  
# 注意:我们需要将'main_program.py'替换为我们的主程序文件名。  
# 此外,请确保这个监控脚本和主程序在同一个目录下,或者提供完整的路径给subprocess.Popen。

1.2说明

(1)主程序文件:我们需要将main_program.py替换为我们希望监控并自动重启的Python程序文件名。

(2)错误处理:上述脚本包含了基本的错误处理,以便在主程序启动失败时能够输出错误信息并尝试重新启动。

(3)重启间隔time.sleep(300)设置了重启之间的等待时间为5分钟。我们可以根据需要调整这个值。

(4)跨平台兼容性:这个脚本在Linux和Windows上都应该能够工作,只要Python环境已经设置好,并且main_program.py是可执行的。

1.3注意

(1)如果主程序是因为异常或错误而频繁退出,仅仅通过重启可能不是解决问题的最佳方法。在这种情况下,我们应该首先调查并修复主程序中的错误。

(2)这个脚本以无限循环的方式运行,直到我们手动停止它。在生产环境中,我们可能希望使用更健壮的服务管理工具(如systemd或Windows服务)来管理它。

对于需要更高级的解决方案来应对Python程序被远程主机强制关闭后自动重新运行进程的问题,我们可以考虑使用守护进程管理工具如supervisor,或者编写更复杂的重试逻辑结合异常处理。以下将详细介绍这两种方法:

2.使用supervisor工具

supervisor是一个用Python编写的守护进程管理工具,它可以监控我们的应用程序,并在崩溃或异常退出时自动重启应用程序。这种方法适用于生产环境,因为它提供了更稳定和可靠的监控与重启机制。

步骤:

(1)安装supervisor
在命令行中运行以下命令来安装supervisor(以Linux为例):

sudo apt-get install supervisor  # Debian/Ubuntu  
sudo yum install supervisor      # CentOS/RHEL

(2)配置supervisor
创建一个配置文件(例如myapp.conf),并在其中指定要监控的Python应用程序的详细信息。配置文件通常位于/etc/supervisor/conf.d/目录下。配置文件的示例如下:

[program:myapp]  
command = python /path/to/your/app.py  
directory = /path/to/your/app  
user = your_username  
autostart = true  
autorestart = true  
startsecs = 5  
stopwaitsecs = 600  
environment = ENV_VAR_1=value, ENV_VAR_2=value

根据我们的应用程序的实际路径和需要设置相应的值。

(3)启动supervisor
运行以下命令来启动supervisor并重新读取配置文件:

sudo supervisorctl reread  
sudo supervisorctl update

(4)监控和管理应用程序
使用以下命令来监控和管理由supervisor管理的应用程序:

sudo supervisorctl status  
sudo supervisorctl tail -f myapp  
sudo supervisorctl restart myapp  
sudo supervisorctl stop myapp

3.编写复杂的重试逻辑结合异常处理

如果我们不想使用额外的工具,可以在Python脚本中编写更复杂的重试逻辑和异常处理机制。这种方法更加灵活,但可能需要更多的代码和逻辑来确保稳定性和可靠性。

示例代码:

import time  
import random  
  
def remote_task():  
    """模拟与远程主机的交互,可能因连接关闭而抛出异常"""  
    # 随机模拟成功与失败  
    if random.choice([True, False]):  
        print("任务执行成功")  
    else:  
        raise ConnectionError("与远程主机连接失败")  
  
def run_task():  
    max_retries = 5  # 最大重试次数  
    retry_interval = 5  # 重试间隔(秒)  
    retries = 0  
  
    while retries < max_retries:  
        try:  
            remote_task()  
            break  # 成功后跳出循环  
        except ConnectionError as e:  
            print(e)  
            print(f"正在尝试重新连接...(剩余重试次数:{max_retries - retries - 1})")  
            time.sleep(retry_interval)  
            retries += 1  
  
    if retries == max_retries:  
        print("达到最大重试次数,任务执行失败。")  
  
if __name__ == "__main__":  
    run_task()

在这个示例中,我们定义了一个remote_task函数来模拟与远程主机的交互,并可能抛出ConnectionError异常。run_task函数则负责在一个循环中运行remote_task,并在捕获到ConnectionError时根据设定的最大重试次数和重试间隔进行重试。

总结

对于需要更高级解决方案的场景,推荐使用supervisor等守护进程管理工具,因为它们提供了更稳定和可靠的监控与重启机制。然而,如果我们希望在不引入额外工具的情况下实现类似功能,编写复杂的重试逻辑和异常处理机制也是一个可行的选择。

标签:主程序,supervisor,Python,主机,重试,program,main,远程
From: https://www.cnblogs.com/TS86/p/18372679

相关文章

  • 【python】面向对象之类成员(字段,方法)
    1.类的成员可以分为三大类:字段、方法和属性注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。2.字段字段包括:普通字段和静态字段,他们在定义和使用中有......
  • 【python】面向对象之继承
    1.什么是继承?通过继承,我们可以从既有的类上衍生出新的类。如果程序的需求为仅修改或删除某项功能,此时不需要将该类的成员数据及成员函数重新写一遍,只需要“继承”原先已定义好的类就可以产生新的类了。继承是指将现有类的属性和行为,经过修改或重写(Override)之后,就可产生出拥有......
  • Python 正则表达式详解 带例题演示
    Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志......
  • 【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)
    系列文章目录监督学习:参数方法【学习笔记】陈强-机器学习-Python-Ch4线性回归【学习笔记】陈强-机器学习-Python-Ch5逻辑回归【课后题练习】陈强-机器学习-Python-Ch5逻辑回归(SAheart.csv)【学习笔记】陈强-机器学习-Python-Ch6多项逻辑回归【学习笔记及课后......
  • 【python】面向对象之封装
    一:面向对象编程有三大特性:封装、继承、多态二:其中最重要的一个特性就是封装。封装指的就是把数据与功能都整合到一起三:什么是封装?1.数据角度讲,将一些基础数据类型复合成一个自定义类型2.行为角度讲,向类外提供必要的功能,隐藏实现的细节3.设计角度分而治之将一个......
  • Linux系统下CUDA与tensorflow与python的版本对应关系
    LinuxCPUVersionPythonversionCompilerBuildtoolstensorflow-2.16.13.9-3.12Clang17.0.6Bazel6.5.0tensorflow-2.15.03.9-3.11Clang16.0.0Bazel6.1.0tensorflow-2.14.03.9-3.11Clang16.0.0Bazel6.1.0tensorflow-2.13.03.8-3.11Clang16.0.0Bazel5.3.0tensorflow-2.......
  • Python 异常处理:掌握错误控制的艺术
            在编程的世界里,错误和异常是不可避免的。正确地处理它们是编写健壮、可靠软件的关键。Python提供了一套强大的异常处理机制,允许我们捕获和处理程序运行时出现的错误。在本文中,我们将探讨Python中的异常处理,包括try-except块、自定义异常、finally子句以......
  • Selenium + Python 自动化测试21(PO+HTML+Mail)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上一篇我们讨论了PO模式并举例说明了基本的思路,今天我们继续学习。        本篇文章我们综合一下之前学习的内容,如先将PO模式和我们生成HTML报告融合起来,综合的灵活的使用之......
  • Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归
    全文链接:https://tecdat.cn/?p=37423原文出处:拓端数据部落公众号“你的命运早在出生那一刻起便被决定了。”这样无力的话语,无数次在年轻人的脑海中回响,尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国,这种现象尤为明显:没有生在大城市的他们,从小便需面对教育......
  • VSCode配置python项目
    一、项目的目录结构推荐的Python项目目录结构根目录*README.md:项目描述、安装说明和用法*requirements.txt:项目依赖项(freeze<requirements.txt生成;install-r.vscode/requirements.txt安装)*.gitignore:用于版本控制的忽略文件源代码目录*__init__.py:空文件,指示目录......