我在使用 runit 设置带有日志记录的服务时遇到了麻烦。以下是我根据 runit 的文档和我在互联网上找到的其他资源创建的文件和脚本的简要概述:
我在 debian 下使用 runit,因此:
/etc/service/test
是 的符号链接/etc/sv/test
。
在下面/etc/sv/test
:
$ ls /etc/sv/test
finish log run
和/etc/sv/test/log
:
$ ls /etc/sv/test/log
config run
剧本run
:
$ cat /etc/sv/test/run
#!/bin/sh
touch /tmp/pid
echo $$ > /tmp/pid
while true; do
date
sleep 3
done
剧本finish
:
$ cat /etc/sv/test/finish
#!/bin/sh
kill `cat /tmp/pid`
脚本如下log
:
cat /etc/sv/test/log/run
#!/bin/sh
exec svlogd -t /var/log/test
该目录/var/log/test
存在,并且服务正在运行。
$ sv s test
run: test: (pid 11547) 536s; down: log: 1s, normally up, want up
但是日志目录是空的...我遗漏了什么?所有日志信息在哪里?
更新:
我还确保所有脚本都是可执行的。
更新2:
似乎sv
由于某种原因,启动日志脚本失败!
$ sv s test
run: test: (pid 14612) 5s; down: log: 0s, normally up, want up
更新 3:
如果您想停止日志记录脚本,您必须发出:
$ sv d test/log
答案1
您的问题中有许多与问题无关的事情需要解决(咳嗽pid 文件咳嗽),让我们来正确解决这个问题。
第一的,日志记录是可选的。虽然大多数情况下您需要一个记录器,但并不强制要求您的服务定义必须有一个记录器。
第二,因为记录器实际上是从属于你的服务的,所以./log
保存记录所需的设置是有意义的。
第三,当您关闭服务时,记录器会因为某种原因而继续运行 - 它会捕获剩余的数据,直到服务终止。这样做是为了防止丢失记录数据,不仅是在服务关闭时,而且在服务崩溃时也是如此。 即使服务中断,记录器仍然运行,这是正常的。 启动服务只会将新的服务实例重新连接到现有的记录器。
第四,您说得对,您可以通过使用命令明确命名来停止记录器sv
。这符合现有daemontools
范例。
第五,除非您有不寻常的需求来记录 svlogd 程序的故障(极不可能),否则您不必担心杀死它等。只需发出信号让它关闭就会导致runsv
监督过程终止它,不需要 PID 或kill
命令。
答案2
因此,经过反复尝试后,我找到了解决方案。
需要注意以下几点:
- 配置文件:请注意,这很违反直觉。如果您在 下监控服务
/etc/sv/test
,并且 下有一个日志目录,/etc/sv/test/log
您会期望它config
位于 中/etc/sv/test/log/config
!但请注意,文件是从您运行 的位置读取的svlogd
。这意味着:如果您的日志脚本在 中运行/var/log/test
( 的最后一个参数),那么这就是配置文件的预期位置。因此,请在List itemsvlogd
中写入您的配置var/log/test/config
- 重新加载配置:如果更改配置文件,则可以用以下命令停止并启动脚本:
$ sv down test/log $ sv start test/log ok: run: test/log: (pid 21190) 0s
答案3
有些事情你没有在问题中问到,它们可能不会影响你的设置行为。但它们就是不对,值得指出。
该
finish
脚本并非用于终止服务。它用于在服务完成后进行清理。我认为您在使用案例中不需要它。runsv
已经知道如何终止服务。为此,我将让您在runsv
手册页。如果您需要服务的 PID,可以从 获取
/etc/sv/test/supervise/pid
。但您可能永远都不需要它。
现在来诊断一下你问到的问题。日志不起作用可能是因为你log/run
在启用服务后添加了。因此,log/supervise
目录没有被创建。
检查我说的是否正确。通过发出命令检查目录是否存在ls /etc/sv/test/log/supervise
。您应该得到类似这样的结果。
$ sudo ls /etc/sv/test/log/supervise
control lock ok pid stat status
如果您收到错误ls: cannot access '/etc/sv/test/log/supervise': No such file or directory
。请禁用并重新启用该服务。即删除符号链接runsvdir/default/
并重新创建它。