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


12

我需要停止/重新启动过程时要执行一个自定义的“停止”脚本runitrunsv)。当前,它只是终止进程,然后运行“完成”脚本。但就我而言,我的进程是动态生成的子进程,因此,除了simple之外kill,我还需要一个a "killtree"来摆脱它们。我怎么做?

我知道应该通过controlrunit 的选项来完成,但是从阅读文档后,我对停止脚本的命名方式并不十分清楚:(

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


您的服务(不是脚本,而是程序)听起来似乎行为不当,应该在拥有自己的子代后进行收割/清理。只是好奇,这是什么?
艾利·佩恩

Answers:


13

来自文档

对于发送到控制管道的每个控制字符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/XX,它是一个可执行文件,当您将相关sv命令发送到服务时(例如,d命令(向下)),该X将运行。如果您的脚本以状态0退出,它将不会尝试关闭服务本身。

基本上,您需要一个可执行脚本/etc/sv/<service>/control/d来执行您想要的任何操作并终止服务,清理pid等。


runsv dir的工作方式非常有趣且简单。
Dzung Nguyen 2014年

2

简单的答案是将清理脚本命名为“ service / finish”。当“服务/运行”退出时,将执行此脚本。

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


1
TERM CONT发送到正在运行的服务后,服务/完成运行。这更像是杀死后清除服务。
MaximKostrikin

2

我必须自己为docker解决此问题。我有uwsgi服务器正在运行,并且在停止容器时docker(TERM而不是INT)发送了错误的信号。

control / x文件的想法是对收到的信号做出反应。在我的情况下,我会将t用于终止信号的文件置于控制中,因为它是为术语信号保留的文件。该脚本应该是可执行的。

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

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

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

因此,在我的情况下,我能够接收术语signal并将int信号发送给服务进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.