在Linux上维护一个长期运行的任务

时间:2011-04-12 00:44:11

标签: linux process

我的系统包括一个任务,它打开网络套接字,从网络接收推送数据,处理它,然后根据消息将其写入磁盘或ping其他计算机。此任务旨在永久运行,并且该服务旨在使此任务始终运行。但有时它会崩溃。

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

一些明显的想法包括检查以确保进程仍在运行的监视程序进程。看门狗可以由cron触发。但它如何知道这个过程是否存在?写一个pidfile? touch心跳文件?如果机器陷入监视器运行速度超过心跳的程度,那么理想的解决方案不会持续增加更多进程。

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

4 个答案:

答案 0 :(得分:2)

sysvinit会重新启动过程,如果已添加到inittab

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

答案 1 :(得分:2)

您可以将monitdaemonize一起使用。在* nix世界中有很多这方面的工具。

答案 2 :(得分:2)

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

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

这取决于修改您希望运行的任务的来源。

答案 3 :(得分:2)

主管专为此任务而设计。来自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,在大多数环境中这应该不是什么大问题,但可能是。