检查长时间运行的Python进程的有效性

检查长时间运行的Python进程的有效性,python,monitoring,Python,Monitoring,如何检查Python进程(不是24*7运行的服务器进程)的有效性?我正在考虑建立以下解决方案 定期从python进程向文件发送心跳信号。在外部,我们可以部署一个系统,它可以检查文件中是否存在条目(最后更新的时间),如果没有,则考虑进程是否已死亡。p> 问题: 有没有更好的解决办法 是否有一些现有的解决方案用于从python进程发送心跳信号 RPC呢?使用rpyc或pyro?您可以公开一个名为get\u heartbeat()的远程方法,该方法将获取时间戳。如果方法锁定、出现错误或值旧,则表示有问

如何检查Python进程(不是24*7运行的服务器进程)的有效性?我正在考虑建立以下解决方案

定期从python进程向文件发送心跳信号。在外部,我们可以部署一个系统,它可以检查文件中是否存在条目(最后更新的时间),如果没有,则考虑进程是否已死亡。p> 问题:

  • 有没有更好的解决办法
  • 是否有一些现有的解决方案用于从python进程发送心跳信号

  • RPC呢?使用
    rpyc
    pyro
    ?您可以公开一个名为
    get\u heartbeat()
    的远程方法,该方法将获取时间戳。如果方法锁定、出现错误或值旧,则表示有问题。不需要文件检查,所有这些都只是一个简单的内存值

    链接:

    下面使用
    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()
    
    和控制scipt

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

    RPC呢?使用
    rpyc
    pyro
    ?您可以公开一个名为
    get\u heartbeat()
    的远程方法,该方法将获取时间戳。如果方法锁定、出现错误或值旧,则表示有问题。不需要文件检查,所有这些都只是一个简单的内存值

    链接:

    下面使用
    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()
    
    和控制scipt

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


    很抱歉,在SOI上询问库建议完全是离题的。我假设您希望在运行监视代码的服务器上监视另一台服务器上的进程?或者它们可以在同一台机器上运行吗?@Tony,是的,Python进程正在另一台机器上运行。@Tony我想到了两种方法,1。我可以使用一些外部监控系统,比如supervisord,它使用进程的pid来监控进程,2。进程本身发送一个心跳信号,表示我还活着。如果进程不应该全天候运行,那么您必须控制主管何时启动/停止。我会选择选项2,然后在另一台服务器上使用另一个进程监视心跳。很抱歉,在SOI上询问库建议完全是离题的。我假设您希望在运行监视代码的另一台服务器上监视该进程?或者它们可以在同一台机器上运行吗?@Tony,是的,Python进程正在另一台机器上运行。@Tony我想到了两种方法,1。我可以使用一些外部监控系统,比如supervisord,它使用进程的pid来监控进程,2。进程本身发送一个心跳信号,表示我还活着。如果进程不应该全天候运行,那么您必须控制主管何时启动/停止。我会选择选项2,然后在另一台服务器上使用另一个进程来监视心跳。原因#1:我的python进程是批处理作业,它们是短期的进程(但可以长时间运行)。原因#2:mesos scheduler()将它们安排在群集主机上运行,因此跟踪PID确实不可行。@LokeshAgrawal在
    pyro
    中这不会是一个问题。您有类似DNS服务器的东西,每个远程服务都向它注册。它们可以在不同的物理机器上,它们只需要能够进行网络发现。因此,您只需让一个python进程保持活动状态,它可以跟踪当前打开和关闭的内容。其次,在这两种情况下,即
    pyro
    rpc
    您不使用PID查找服务,服务是按名称和端口查找的。实际上,正如我所说,这不是24*7服务器应用程序。这些是短期的批处理作业流程。每天大约有12万个批处理作业流程开始,完成任务,然后死亡。@LokeshAgrawal我仍然不明白。我的解决方案是部署一个管理器(需要24*7运行),您可以创建一个简单的脚本,批处理作业开始时用它注册,结束时用它发送结束信号。写入文件更麻烦,可靠性更低。您想创建120k文件还是将它们全部写入同一个文件?这两种情况都存在很多不可靠性>>您创建了一个简单的脚本,批处理作业在开始时使用该脚本进行注册,在它们结束时发送结束信号。假设批处理作业启动并注册自身,但不知何故它被杀死了(可能有人向它发送了SIGKILL)。在这种情况下,当它死亡时将无法发送信号。一种解决方案是假设它在特定的时间间隔内没有发送任何结束信号,但这并不总是正确的-例如,如果作业由于系统负载或其他原因而花费太长时间来完成其任务,那么它就会死亡。这种方法可能不适用于我的用例。原因#1:我的python进程是批处理作业,它们是短期的进程(但可以长时间运行)。原因#2:mesos scheduler()将它们安排在群集主机上运行,因此跟踪PID确实不可行。@LokeshAgrawal在
    pyro
    中这不会是一个问题。您有类似DNS服务器的东西,每个远程服务都向它注册。它们可以在不同的物理机器上,它们只需要能够进行网络发现。因此,您只需让一个python进程保持活动状态,它可以跟踪当前打开和关闭的内容。其次,在这两种情况下,即
    pyro
    rpc
    您不使用PID查找服务,服务是按名称和端口查找的。实际上,正如我所说,这不是24*7服务器应用程序。这些是短期的批处理作业流程。每天大约有12万个批处理作业流程开始,完成任务,然后死亡。@LokeshAgrawal我仍然不明白。我的解决方案是部署一个管理器(需要24*7运行),您可以创建一个简单的脚本,批处理作业开始时用它注册,结束时用它发送结束信号。写入文件要麻烦得多,也不太可靠