如何编写 runit 自定义停止脚本

如何编写 runit 自定义停止脚本

我希望有一个自定义“停止”脚本runit( runsv),在必须停止/重新启动进程时执行。目前,它只是终止进程,然后运行“完成”脚本。但就我而言,我的进程会动态生成子进程,因此,除了简单的kill,我需要一个"killtree"来摆脱它们。我该怎么做?

我知道它应该通过 runit 的选项来完成control,但是从阅读文档中我并不清楚停止脚本应该如何命名 :(

http://smarden.org/runit/runsv.8.html

答案1

来自文档

对于发送到控制管道的每个控制字符 c,runsv 首先检查 service/control/c 是否存在且可执行。如果存在,则启动 service/control/c 并等待其终止,然后再解释命令。如果程序退出并返回代码 0,runsv 将避免向服务发送相应的信号。命令 o 始终被视为命令 u。对于命令 d,首先检查 service/control/t,然后检查 service/control/d。对于命令 x,首先检查 service/control/t,然后检查 service/control/x。可选日志服务的控制无法自定义。

这意味着您需要创建一个service_name/control/X,X 是可执行文件,当您sv向服务发送相关命令(如d命令 (down))时,它将运行。如果您的脚本以状态 0 退出,它将不会尝试关闭服务本身。

基本上,您需要一个可执行脚本,/etc/sv/<service>/control/d它可以执行任何您想做的事情,终止服务、清理 pid 等等。

答案2

简单的答案是将清理脚本命名为“service/finish”。此脚本在“service/run”退出时执行。

还有一个“service/control/ctrl_char 接口。它允许您根据发送给 runsv 的命令执行不同的操作。

答案3

我必须自己为 docker 解决这个问题。我运行了 uwsgi 服务器,在停止容器时 docker 向它发送了错误信号(TERM 而不是 INT)。

control/x 文件的目的是对接收到的信号做出反应。在我的例子中,我会将一个t用于终止信号的文件放入控制中,因为它是为术语信号保留的文件。该脚本应该是可执行的。

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

该脚本向 uwsgi 进程发送一个 int 信号,这正是我想要的。

如果控制脚本没有错误地退出(返回代码 0),则原始信号将不会发送给该进程。

因此就我而言,我能够接收术语信号并向服务进程发送 int 信号。

相关内容