python - 防止 Python 脚本失败
问题描述
我有一个 python 脚本,它将在树莓上 24/7 运行至少五个月,如果出现任何问题,我无法访问该东西以重新启动它。它使用各种库连接到 sql 数据库、无线 RFID 阅读器等。
它基本上是几十行定义函数,通过usb/serial将覆盆子连接到设备,然后是一个大while True:
循环。
我想确保如果发生错误,代码将继续运行(或重试直到没有错误发生)并且不会卡在错误上。我读过我可以使用,try: Except:
但似乎不推荐。
您是否有任何资源可以让我学习如何使 python 脚本防弹,无论发生什么,或有关如何做到这一点的想法?
解决方案
使用systemd、monit或runit注册它。这些是服务管理器,当他们正在观看的程序死机时,会注意到它的缺失并使用您提供的命令行机制重新启动它。了解它们可能有点棘手(并提供pid或其他方案来“签署”python 脚本的存在),但这是它们的设计目的。我自己很喜欢 runit,但 systemd(也许很不幸)出现在大多数 Linux 发行版中。
你所依赖的其他东西,不仅仅是你的脚本,也可能需要类似的监视,尽管通常像数据库服务器这样的东西已经从一开始就已经配置好了自己。
过去确保良好的编码卫生、质量和测试,在任何程序本身(使用 Python 或其他语言)中解决您的需求类型是一种非生产性和错误的令人放心的追求。高可用性机制依赖于第二个程序重新启动第一个程序的工作/主或同级系统。不是从你自己的编程技能中“希望最好”。
正如@Ondrej K 所说,这最好留给您的发行版 - init是另一个专门用于此的框架。对于一个配置良好的 Linux 系统来说,五个月的正常运行时间是完全合理的期望。而且,正如他所指出的,这些机制还包括系统重启。
需要明确一点:您仍然需要确保您的程序在所有情况下都能自行处理 - 例如,如果它卡在写权限错误上,则循环重启将无济于事。
PS 如果 Pi 已联网,如果您需要访问它, ssh可能会有所帮助。
推荐阅读
- r - Labeller 在 facet_grid 中重构后未应用标签
- java - 为什么我在使用表情符号获取 cdata 元素时在 xml 标记中获取多个 cdata
- spring-boot - 带安全性的 Springboot 测试
- c++ - 自定义类 - 设置时成员变量为空
- cluster-computing - 如何为 Redhat 集群创建(软件)防护代理
- python - 在 python 中将 REST 数据导出为 CSV
- python - 将过滤后的数据复制回Python中的同一数据框
- html - CSS grid-template-areas 占用空间,即使列和行是空白的
- swift - 快速字符串任务
- c# - CS1061:“IEnumerable
" 不包含 'OrderByDescending()' 的定义