我的系统包括一个任务,它打开一个networking套接字,接收来自networking的推送数据,处理它,并将其写入磁盘或根据消息ping其他机器。 此任务旨在永久运行,并且该服务旨在使此任务始终运行。 但有时它会崩溃。
保持这样的任务的最佳做法是什么? 假设任务在我们重新启动之前最多可以停留30秒,这是可以的。
一些明显的想法包括有一个看门狗进程,检查以确保进程仍在运行。 看门狗可以由cron触发。 但是如何知道这个过程是否还活着呢? 写一个pidfile? touch心跳文件? 如果机器陷入到看门狗比心跳更快的地步,一个理想的解决scheme不会持续地启动更多的进程。
有这个标准的Linux工具吗? 我可以想象一个使用消息队列的解决scheme,但我不确定这是不是一个好主意。
根据您希望监视的任务的性质,一种方法是编写一个简单的包装来在fork()中启动您的任务。
包装任务然后可以对子进行waitpid(),如果终止,则重新启动它。
这取决于修改您希望运行的任务的来源。
如果添加到inittab , sysvinit将重新启动进程。
如果您担心进程被冻结而没有崩溃并结束进程,则可以使用心跳并硬性杀死活动实例,让init重新启动它。
你可以使用monit和守护进程 。 * nix世界里有很多这样的工具。
主管正是为这项任务而设计的。 从项目网站 :
Supervisor是一个客户端/服务器系统,它允许用户监视和控制类UNIX操作系统上的大量进程。
它作为一个守护进程( supervisord )运行,由命令行工具supervisorctl 。 配置文件包含一个应该监视的程序列表,以及其他设置。
选项的数量是相当广泛的 – 看一看完整列表的文档 。 在你的情况下,相关的配置部分可能是这样的:
[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,在大多数环境中这不应该是一个大问题,但可能是。