【问题标题】:Maintaining a long-running task on Linux在 Linux 上维护长期运行的任务
【发布时间】:2011-04-12 00:44:11
【问题描述】:

我的系统包含一个任务,它打开一个网络套接字,接收来自网络的推送数据,对其进行处理,然后将其写入磁盘或根据消息 ping 其他机器。该任务旨在永远运行,并且该服务旨在让该任务始终运行。但有时它会崩溃。

让这样的任务保持活力的最佳做法是什么?假设在我们重新启动之前,该任务最多可以停止 30 秒。

一些明显的想法包括有一个看门狗进程来检查以确保进程仍在运行。看门狗可以由cron 触发。但它如何知道进程是否存在?写一个pidfile? touch 心跳文件?如果机器陷入到看门狗运行速度快于心跳的程度,理想的解决方案不会持续启动更多进程。

有没有标准的 linux 工具可以解决这个问题?我可以想象一个使用消息队列的解决方案,但我不确定这是否是个好主意。

【问题讨论】:

  • 投票转为超级用户,unix.se 可能会更好。

标签: linux process


【解决方案1】:

根据您希望监控的任务的性质,一种方法是编写一个简单的包装器以在 fork() 中启动您的任务。

包装器任务然后可以对子进程执行 waitpid() 并在它终止时重新启动它。

这确实取决于修改您希望运行的任务的源代码。

【讨论】:

    【解决方案2】:

    sysvinit 如果添加到inittab,将重新启动死掉的进程。

    如果您担心进程冻结而不会崩溃并结束进程,您可以使用心跳并硬杀死活动实例,让 init 重新启动它。

    【讨论】:

      【解决方案3】:

      您可以将monitdaemonize 一起使用。在 *nix 世界中有很多工具可以做到这一点。

      【讨论】:

        【解决方案4】:

        Supervisor 专为这项任务而设计。来自project website

        Supervisor 是一个客户端/服务器系统,允许其用户监视和控制类 UNIX 操作系统上的许多进程。

        它作为守护进程 (supervisord) 运行,由命令行工具 supervisorctl 控制。配置文件包含它应该监视的程序列表以及其他设置。

        选项的数量相当广泛,请查看docs 以获取完整列表。在您的情况下,相关的配置部分可能是这样的:

        [program:my-network-task]
        command=/bin/my-network-task   # where your binary lives
        autostart=true                 # start when supervisor starts?
        autorestart=true               # restart automatically when stopped?
        startsecs=10                   # consider start successful after how many secs?
        startretries=3                 # try starting how many times?
        

        我自己也使用过 Supervisor,一切都设置好后效果非常好。它需要 Python,这在大多数环境中应该没什么大不了的,但可能是。

        【讨论】:

        • 我最终使用了 supervisord。我发现这段经历真的很痛苦。许多已知的长期存在的错误。它正是为此而设计的,但其他项目(如 god 或 monit)也是如此。我希望我选择了别的东西。 YMMV。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2018-02-10
        • 2013-06-07
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多