我需要停止/重新启动过程时要执行一个自定义的“停止”脚本runit
(runsv
)。当前,它只是终止进程,然后运行“完成”脚本。但就我而言,我的进程是动态生成的子进程,因此,除了simple之外kill
,我还需要一个a "killtree"
来摆脱它们。我怎么做?
我知道应该通过control
runit 的选项来完成,但是从阅读文档后,我对停止脚本的命名方式并不十分清楚:(
我需要停止/重新启动过程时要执行一个自定义的“停止”脚本runit
(runsv
)。当前,它只是终止进程,然后运行“完成”脚本。但就我而言,我的进程是动态生成的子进程,因此,除了simple之外kill
,我还需要一个a "killtree"
来摆脱它们。我怎么做?
我知道应该通过control
runit 的选项来完成,但是从阅读文档后,我对停止脚本的命名方式并不十分清楚:(
Answers:
来自文档
对于发送到控制管道的每个控制字符c,runsv首先检查service / control / c是否存在并且可执行。如果是这样,它将在解释命令之前启动service / control / c并等待其终止。如果程序以返回代码0退出,则runv拒绝向服务发送相应的信号。命令o始终被视为命令u。在命令d上首先检查service / control / t,然后检查service / control / d。在命令x上首先检查service / control / t,然后检查service / control / x。可选日志服务的控件无法自定义。
这意味着您需要创建一个service_name/control/X
X,它是一个可执行文件,当您将相关sv
命令发送到服务时(例如,d
命令(向下)),该X将运行。如果您的脚本以状态0退出,它将不会尝试关闭服务本身。
基本上,您需要一个可执行脚本/etc/sv/<service>/control/d
来执行您想要的任何操作并终止服务,清理pid等。
简单的答案是将清理脚本命名为“ service / finish”。当“服务/运行”退出时,将执行此脚本。
还有一个“ service / control / ctrl_char接口。它允许您根据发送给runs的命令执行不同的操作。
我必须自己为docker解决此问题。我有uwsgi服务器正在运行,并且在停止容器时docker(TERM而不是INT)发送了错误的信号。
control / x文件的想法是对收到的信号做出反应。在我的情况下,我会将t
用于终止信号的文件置于控制中,因为它是为术语信号保留的文件。该脚本应该是可执行的。
#!/bin/bash
kill -INT `cat /tmp/project-master.pid`
该脚本向uwsgi进程发送一个int信号,这就是我想要的。
如果控制脚本正在退出且没有错误(返回代码0),则原始信号将不会发送到进程。
因此,在我的情况下,我能够接收术语signal并将int信号发送给服务进程。