python - 如何在前一个会话超时后通过 pyghmi.impi.command.Command 打开一个新的 pyghmi 会话?
问题描述
我在使用pyghmi
python 库时遇到了一些问题,该库用于使用 python 脚本发送 IPMI 命令。我的目标是实现一个 HTTP API 以通过 HTTP 请求发送 IPMI 命令。
我已经能够创建一个会话并使用库发送一些命令,但如果会话保持空闲 30 秒,它会自行注销。当 Session 注销时,我无法创建一个新的:我收到错误“会话已注销”或死锁。
如果我想拥有一台始终处于启动状态的服务器并在收到请求时创建 Session,如果在前一个会话注销时我无法创建新会话,我该怎么办?
我试过的:
from pyghmi.ipmi import command
ipmi = command.Command(ip, user, passwd)
res = ipmi.get_power()
print(res)
# wait 30 seconds
res2 = ipmi.get_power() # get "Session logged out" error
ipmi2 = command.Command(ip, user, paswd) # Deadlock if wait < 30 seconds, else no error
res3 = ipmi2.get_power() # get "Session logged out" error
# Impossible to create new command.Command() Session, every command will give "logged out" error
另一个问题是我不能通过在command.Command()
调用中提供“onlogon 回调”函数来使用异步方式,因为我需要调用者中的回调返回值,而这种线程行为是不可能的。
编辑:我已经尝试过这里提供的一些示例,但它始终是一次性运行脚本,而我正在寻找可以永远“保持”状态的东西。
解决方案
所以我终于实现了一种解决方案。我给 Pyghmi 的主要贡献者发了电子邮件,他说这个库不适合多和可重用的 Session 实现(目前 Pyghmi 存储库上有一个未解决的问题“会话重用”)。
第一个“解决方案”:使用流程
我的目标是创建一个 HTTP API。为了避免会话超时问题,我为每个新请求创建一个新进程(不是线程)。这很好用,但我没有保留这个解决方案,因为它很重并且消耗套接字。似乎通过创建进程,Pyghmi 使用的内存不会在进程之间共享(这是进程的目标),因此每次 Session 使用都不是重用而是创建。
第二个“解决方案”:使用 Confluent
Confluent 是联想开发的一个工具,允许通过 HTTP 控制硬件。它使用一种修补版本的 Pyghmi 作为 IPMI 调用的后端。汇合文档在这里。
在服务器上安装和配置后,Confluent 可以很好地通过 HTTP 控制 IPMI 设备。我将它与一个ipmi_simulator
用于测试目的的 Docker 映像一起打包:confluent dockerized。
推荐阅读
- javascript - 我可以取消承诺的执行吗?试图检查数千个链接并且不想等待请求超时
- django - 如何使用 django-filter 的 Filter.method 自定义过滤
- reactjs - 使用反应创建可重用标头的方法
- php - 将自定义样式添加到数据表分页
- typescript - 如何在 AngularFire 中使用文档 ID 查询文档?
- svg - 三:使用worldmap.svg作为球体上的材质但是像素太多,如何减少它们?
- c# - Microsoft Tsql Scriptdom 中的哪个 API 将允许我从 SQL 脚本中检索/存储所有表引用?
- python - FileNotFoundError: [Errno 2] No such file or directory error with numpy
- pip - 使用 pip 安装 spaCy 失败,并出现错误“为 blis 构建轮子失败”
- mysql - 识别两个表之间的缺失行