我正在使用 svscan 监督一个脚本,该脚本可能会遇到错误并卡在那里。当脚本终止时,svscan 会立即重新启动它,但会立即终止。所以它不断地重新启动它。我似乎没有找到 svscan 的任何设置或配置,例如重试计数或其他内容。您知道类似的事情吗?
答案1
最初的 Bernstein daemontools 没有这方面的机制。服务目录下只有一个run
程序和固定的自动重启策略。然而,daemontools 系列的几个成员对此进行了改进,并且具有灵活的通用机制,可用于解决此类情况。
- 格里特·佩普的鲁尼特和洛朗·贝尔科特的 s6两者都提供了程序的机制
finish
。 - Bruce Guenter 的 daemontools-encore提供了程序的机制
notify
。 - 韦恩·马歇尔的罪犯
rc.main
具有使用子命令调用程序的机制reset
。 - 我的小吃工具集提供了程序的机制
restart
。
这些都是可以在您的情况下使用的通用机制。我将在这里更详细地讨论 nosh 服务管理。如何将其应用到其他方面应该是相当明显的。
nosh中的自动重启控制
在 nosh 服务管理中,daemontools-encore 使用相同的扩展(相对于 Bernstein 原始)服务状态:停止了,开始,开始了,跑步,失败的, 和停止。
服务启动前、处于服务状态时开始状态下,nosh 服务管理器运行该start
程序。
当服务终止且仍处于“启动”状态时,nosh 服务管理器运行该restart
程序,在失败的状态,以确定是否转换回跑步国家或停止(然后到停止了) 状态。该restart
程序以特定于服务的方式为其做出此确定,并且它是明确决定服务是否重新启动“太多次”或以某种其他方式变得无法重新启动的地方。
restart
作为命令行参数传递有关主服务进程如何终止的信息(无论是正常退出还是响应信号,以及退出代码或特定信号)。服务经理选择转换回跑步说明restart
程序是否可以运行并以成功状态终止,并转换到停止(因此停止了) 另有说明。
restart
可以start
是您喜欢的任何内容:Perl 程序、shell 脚本、execline 程序、编译的二进制文件等等。它们是 shell 脚本编写中相当简单的练习,带有case
...esac
和if
... fi
。 nosh-bundles 包中提供了一些用 shell 脚本编写的程序示例restart
,可以使用适用于 Debian/Ubuntu和适用于 FreeBSD/PC-BSD/DragonFlyBSD/&c。。
因此,要确定某个服务是否已重新启动“太多次”,您可以让start
程序对计数器进行零初始化(在服务目录中的文件中),并且您的restart
程序会递增该计数器,并且仅在计数器达到时才返回成功状态小于某个值。当然,你可以做出包含更多因素和其他因素的决定。
- 如果服务崩溃或因信号中止,您可能还希望停止自动重新启动,并且只有在它干净地退出或被“干净终止”信号(例如 )干净地终止时才自动重新启动
SIGTERM
。 - 如果您检测到服务已损坏(以某种特定于服务的方式),以至于在没有管理员干预的情况下无法再次正常启动,您可能希望停止自动重新启动。
- 比如说,您可能想要引入某种速率限制机制,涉及计算的
sleep
周期。
进一步阅读
- 乔纳森·德博因·波拉德 (2015)。守护进程工具家族。常见答案。
- 乔纳森·德博因·波拉德。
service-manager
。 小吃指南。这小吃指南可用为Debian/Ubuntu 软件包和FreeBSD/PC-BSD/DragonFlyBSD/&c。包裹,并且
service-manager
无需任何互联网连接即可在您的计算机上通过以下方式访问该手册:man service-manager
xdg-open /usr/local/share/doc/nosh/service-manager.html
- 布鲁斯·冈特尔.
supervise
。 daemontools-encore 手册。 §8。 - 格里特·帕普.
runsv
。运行手册。 §8。 - 韦恩·马歇尔(2013)。
perpetrate
。犯人手册。 §5。 - 洛朗·贝尔科特.
s6-supervise
。 s6说明书. Skarnet 软件。