我的系统包括一个任务,它打开网络套接字,从网络接收推送数据,处理它,然后根据消息将其写入磁盘或ping其他计算机。此任务旨在永久运行,并且该服务旨在使此任务始终运行。但有时它会崩溃。
保持这样的任务活着的最佳做法是什么?假设任务在我们重新启动之前最多可以死30秒。
一些明显的想法包括检查以确保进程仍在运行的监视程序进程。看门狗可以由cron
触发。但它如何知道这个过程是否存在?写一个pidfile? touch
心跳文件?如果机器陷入监视器运行速度超过心跳的程度,那么理想的解决方案不会持续增加更多进程。
是否有标准的linux工具?我可以想象一个使用消息队列的解决方案,但我不确定这是不是一个好主意。
答案 0 :(得分:2)
sysvinit
会重新启动过程,如果已添加到inittab
。
如果你担心进程冻结而不崩溃并结束进程,你可以使用心跳并硬杀死活动实例,让init重新启动它。
答案 1 :(得分:2)
答案 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,在大多数环境中这应该不是什么大问题,但可能是。