【问题标题】:Checking aliveness of a long running Python process [closed]检查长时间运行的 Python 进程的活跃性 [关闭]
【发布时间】:2019-07-25 08:26:44
【问题描述】:

如何检查 Python 进程(不是 24*7 运行的服务器进程)的活跃度?我正在考虑构建以下解决方案,

定期从 python 进程向文件发送心跳。在外部,我们可以部署一个系统来检查文件中是否存在条目(最后更新时间),如果没有,则认为进程已死。

问题:

  1. 还有比这更好的解决方案吗?
  2. 是否有一些现有的解决方案可以从 python 进程发送心跳?

【问题讨论】:

  • 很抱歉,但要求图书馆推荐完全是题外话
  • 我假设您想在另一台服务器上监控进程,而不是您正在运行监控代码的服务器?或者他们可以在同一台机器上运行?
  • @Tony,是的,Python 进程正在另一台机器上运行。
  • @Tony 我在考虑两种方法,1. 我可以使用一些外部监控系统,例如使用进程的 pid 监控进程的 supervisord,2. 进程本身发送我还活着的心跳。
  • 如果进程不应该 24/7 运行,您还必须控制主管何时启动/停止。我会选择选项 2,然后使用不同服务器上的另一个进程监控心跳。

标签: python monitoring


【解决方案1】:

RPC 呢?使用rpycpyro?您可以公开一个名为 get_heartbeat() 的远程方法,该方法将获取时间戳。如果方法锁定、错误或值过时,则表明出现问题。无需文件检查,只需简单的内存值即可。

链接:

https://pyro4.readthedocs.io

https://rpyc.readthedocs.io/en/latest/

下面的例子使用rpyc:

import rpyc

class MyService(rpyc.Service):
    heartbeat = 0 # Here you can insert timestamp from different object, update it or even leave a reference to an object that has the heartbeat variable 
    def on_connect(self, conn):
        # code that runs when a connection is created
        # (to init the service, if needed)
        pass

    def on_disconnect(self, conn):
        # code that runs after the connection has already closed
        # (to finalize the service, if needed)
        pass

    def exposed_get_heartbeat(self): # this is an exposed method
        return self.heartbeat

if __name__ == "__main__":
    from rpyc.utils.server import ThreadedServer
    t = ThreadedServer(MyService, port=18861)
    t.start()

还有控制脚本

import rpyc
c = rpyc.connect("localhost", 18861)
while True:
   try:
        c.root.get_heartbeat()
        sleep(5)
   except Exception:
        pass
        #Error logic goes here

【讨论】:

  • 这种方法可能不适用于我的用例。原因#1:我的 python 进程是 BatchJobs,它们是短暂的进程(但可以长时间运行)。原因#2:它们被 mesos 调度程序 (mesos.apache.org) 安排在集群主机上运行,​​因此跟踪 PID 确实不可行。
  • @LokeshAgrawal 在pyro 中这不是问题,您拥有类似于 DNS 服务器的东西,每个远程服务都会向它注册自己。它们可以在不同的物理机器上,它们只需要能够被网络发现。因此,您只需保持一个 python 进程处于活动状态,该进程会跟踪当前开启和关闭的内容。其次,在pyrorpc 这两种情况下,您都不使用PID 来查找服务,而是通过名称和端口发现服务。
  • 实际上,正如我所说,这不是 24*7 服务器应用程序。这些是短暂的批处理作业流程。每天大约有 120,000 个批处理作业流程开始,完成其工作并终止。
  • @LokeshAgrawal 我还是不明白。我的解决方案是改为部署一个主管(需要 24*7 运行),您创建一个简单的脚本,您的批处理作业在启动时注册并在它们死亡时发送结束信号。写入文件更麻烦,更不可靠。你想创建 120k 文件还是让它们都写入同一个文件?这两种情况都存在很多不可靠性
  • >> 您创建一个简单的脚本,您的批处理作业在开始时注册并在它们死亡时发送结束信号。假设批处理作业启动并注册自己,但后来不知何故被杀死(也许有人向它发送 SIGKILL )。在这种情况下,它死后将无法发送信号。一种解决方案是假设它在特定时间间隔内没有发送任何结束信号就死了,但这并不总是正确的——例如,如果由于系统负载或其他原因,作业需要很长时间才能完成其任务。
猜你喜欢
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2023-04-08
相关资源
最近更新 更多