首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月21日 21:13

要实现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等守护进程管理工具,因为它们提供了更稳定和可靠的监控与重启机制。然而,如果我们希望在不引入额外工具的情况下实现类似功能,编写复杂的重试逻辑和异常处理机制也是一个可行的选择。

From:https://www.cnblogs.com/TS86/p/18372679
本文地址: http://www.shuzixingkong.net/article/1312
0评论
提交 加载更多评论
其他文章 CVSS(Common Vulnerability Scoring System)打分规则解读
CVSS(Common Vulnerability Scoring System)提供了一种根据漏洞的主要特征进行打分,反映其严重性的方法。CVSS 已成为被广泛使用的标准。 下面是CVSS 3.1版本计算器的界面截图,本文对Base Score的打分标准做解读,并提供一些建议。同时会对每个维度选项
CVSS(Common Vulnerability Scoring System)打分规则解读
代码随想录Day22
77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2: 输入:n = 1
代码随想录Day22
WPF:MVVM的由来与属性绑定的过程
WPF:MVVM的由来与属性绑定的过程 1、MVVM (1)MVVM是什么? ​ MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式。有助于分离应用程序的业务逻辑和用户界面层,使得开发过程更易于管理,同时也便于单元测试。 Model? 现实世界中对象的抽象结果。
WPF:MVVM的由来与属性绑定的过程 WPF:MVVM的由来与属性绑定的过程 WPF:MVVM的由来与属性绑定的过程
P7706 文文的摄影布置 题解
P7706 文文的摄影布置 题解 原题 读完题,发现是线段树。单点修改+区间查询。 不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值)。 对于一个区间的待求值,大概有四种情况: 如上图四种情况分别为: 待求值最大值在左区间 待求值最大值在右区间 \(a_i与b_j\) 在左
P7706 文文的摄影布置 题解
使用FModel提取黑神话悟空的资产
目录前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook。 本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的基础使用流程,请见《使用FModel提取UE4/5游戏资产》 本文仅演示steam平台下的解包过程 设置 在FM
使用FModel提取黑神话悟空的资产 使用FModel提取黑神话悟空的资产 使用FModel提取黑神话悟空的资产
Dapr v1.14 版本已发布
Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统难题,由此显著提高生产力并缩短开发时长。Dapr 是用于构建云原生应用程序的开发人员框架,可以更轻松
使用分布式锁解决IM聊天数据重复插入的问题
导航 业务背景 问题分析与定位 探索可行的解决方案 数据库层面处理——唯一索引 应用程序层面处理——分布式锁 分布式锁概述 分布式锁需要具备哪些特性? 分布式锁有哪些实现方式? 基于数据库的实现方式 基于Redisson实现方式 Redission介绍 概述 可重入锁 基于Redisson解决方案
使用分布式锁解决IM聊天数据重复插入的问题 使用分布式锁解决IM聊天数据重复插入的问题 使用分布式锁解决IM聊天数据重复插入的问题
DDD建模后写代码的正确姿势(Java、dotnet双平台)
本文书接上回《一种很变态但有效的DDD建模沟通方式》,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新; DDD框架源码(.NET、Java双平台); 加群畅聊,建模分析、技术交流; 视频和直播在B站。 终于到了写代码的环节 如果你已经阅读过本系列前面的所有文章,我相信你对需求分析和建模设计有
DDD建模后写代码的正确姿势(Java、dotnet双平台) DDD建模后写代码的正确姿势(Java、dotnet双平台) DDD建模后写代码的正确姿势(Java、dotnet双平台)