Python被远程主机强制关闭后怎么自动重新运行进程
要实现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等守护进程管理工具,因为它们提供了更稳定和可靠的监控与重启机制。然而,如果我们希望在不引入额外工具的情况下实现类似功能,编写复杂的重试逻辑和异常处理机制也是一个可行的选择。
Python被远程主机强制关闭后怎么自动重新运行进程的更多相关文章
- Java恶搞!强制关闭电脑上的程序进程!
效果 最近写代码经常和各种进程打交道,发现了一个很有意思的黑科技. 我直接说有什么用吧,可以设置每隔多少时间检查某个程序是否在使用,如果在用,就强制关闭.比如,有的sb舍友晚上就是不睡觉,一边打游戏一 ...
- jenkins结合supervisor进行python程序发布后的自动重启
jenkins结合supervisor进行python程序发布后的自动重启 项目背景: 通过jenkins发布kvaccount.chinasoft.com站点的python服务端程序,业务部门同事需 ...
- [转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054
python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...
- 等Excel工作簿关闭后自动加密压缩备份
;; 等Excel工作簿关闭后自动加密压缩备份.ahk;; 腾讯QQ号 595076941; 作者:boai; 写作日期:2019年5月15日; 版本号:第1版; 手机号(中国移动) 138##### ...
- 等Excel工作簿关闭后自动加密压缩备份2019年10月9日.ahk
;; 等Excel工作簿关闭后自动加密压缩备份2019年10月9日.ahk;; 腾讯QQ号 595076941; 作者:徐晓亮(weiyunwps618); 写作日期:2019年5月15日; 版本号: ...
- 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.
- Pycharm关闭后Python.exe还是在后台运行
pycharm运行程序关闭后会弹出一个对话框: 一定要选择第一个,不然python.exe一直会在后台运行.
- 浏览器关闭后,Session会话结束了么?
今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了? 我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保 存当前用户的状态信息 ...
- Java Web 浏览器关闭后Session就会被销毁吗?
浏览器关闭后Session就会被销毁吗? Session是JSP的九大内置对象(也称为隐含对象)中的一个,用于保存当前用户的状态信息,初学者可能认为Session的生命周期是从打开一个浏览器发送请求到 ...
- Session的生命周期之关于浏览器关闭后的Session
Session是JSP的九大内置对象中的一个,它可以保存当前用户的各种的状态信息. 初次接触Session时认为Session的生命周期是从浏览器打开一个窗口发送请求开始,到浏览器窗口关闭结束.其实这 ...
随机推荐
- Netty(一)IO模型
1. Netty介绍 Netty 是由JBOSS提供的一个Jave开源框架,是一个异步地.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络IO程序. Netty主要针对在TCP协议下,面向 ...
- Redis的几种应用实战
1.分布式锁: 实现:用set key value ex time nx指令实现,这个指令以及其参数是原子性的操作.释放锁用del key,释放之前先比较一下value是否与当前的value一样,原因 ...
- NXP i.MX 8M Mini开发板规格书(四核ARM Cortex-A53 + 单核ARM Cortex-M4,主频1.6GHz)
1 评估板简介 创龙科技TLIMX8-EVM是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高性能评估板,由核心板和 ...
- OpenStack 下 CentOS6.X 镜像网络初始化失败问题排查
问题表现 在我的 OpenStack 集群上迁移了一批老旧的镜像(从其他三方云平台过来的)发现这批镜像在使用 ConfigDrive 的方式注入配置初始化时无法对非首张网卡镜像初始化(后经过测试非 C ...
- Blazor Server App Cannot find the fallback endpoint specified by route values
github官方issues中提到的解决方案,CreateBuilder时指定项目绝对路径可以解决. 1 // 指定项目路径,也可以用Assembly.GetCallingAssembly获取 2 c ...
- vue-模块工程化-手稿
- .NET周刊【7月第2期 2024-07-14】
国内文章 开源GTKSystem.Windows.Forms框架让C# winform支持跨平台运行 https://www.cnblogs.com/easywebfactory/p/18289178 ...
- PHP中引用的详解(引用计数、写时拷贝)
转载:https://blog.csdn.net/ljguo212/article/details/8972865 1. PHP中引用的特性 PHP中引用意味着用不同的名字访问同一个变量内容,引用不是 ...
- .NET Core 3.x 基于AspectCore实现AOP,实现事务、缓存拦截器
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存.这个也是网上说的面向切面编程AOP. A ...
- SQL 注入漏洞详解 - Union 注入
1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在 ...