2011-04-12 89 views
5

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

保持此类任务的最佳做法是什么?假设任务在我们重新启动之前最多可以停留30秒即可。

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

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

+1

投票转移到超级用户,unix.se可能会更好。 – 2011-04-12 00:50:06

回答

2

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

包装任务然后可以对子进行一次waitpid(),如果终止,则重新启动它。

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

2

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

如果你担心过程中冻结没有崩溃和结束的过程中,你可以使用一个心跳和硬杀伤主动实例,让INIT重新启动它。

2

你可以使用与daemonize一起monit。在* nix世界里有很多这样的工具。

2

主管被精确地设计用于这项任务。从project website

主管是一个客户机/服务器系统,它允许用户以监测和控制在UNIX之类的操作系统的一些过程。

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

选项的数目是相当广泛的, - 看看在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? 

我用超级自己和它的工作真的很好,一旦一切都成立。它需要Python,在大多数环境中这应该不是什么大问题,但可能是这样。

+0

我结束了使用supervisord。我发现这个经历非常痛苦。许多已知的,长期存在的错误。它是专门为此设计的,但其他项目如上帝或monit也是如此。我希望我选择了别的东西。因人而异。 – Leopd 2014-04-25 00:01:29

相关问题