我在使用 runit 设置带有日志记录的服务时遇到问题。以下是我根据 runit 的文档和我在互联网上找到的其他资源创建的文件和脚本的简要概述:
我在 debian 下使用 runit,因此:
/etc/service/test
是到 的符号链接/etc/sv/test
。
下/etc/sv/test
:
$ ls /etc/sv/test
finish log run
Run Code Online (Sandbox Code Playgroud)
并且/etc/sv/test/log
:
$ ls /etc/sv/test/log
config run
Run Code Online (Sandbox Code Playgroud)
该run
脚本:
$ cat /etc/sv/test/run
#!/bin/sh
touch /tmp/pid
echo $$ > /tmp/pid
while true; do
date
sleep 3
done
Run Code Online (Sandbox Code Playgroud)
该finish
脚本:
$ cat /etc/sv/test/finish
#!/bin/sh
kill `cat /tmp/pid`
Run Code Online (Sandbox Code Playgroud)
和log
脚本:
cat /etc/sv/test/log/run
#!/bin/sh
exec svlogd -t /var/log/test
Run Code Online (Sandbox Code Playgroud)
目录/var/log/test
存在,服务运行。
$ sv s test
run: test: (pid 11547) 536s; down: log: 1s, normally up, want up
Run Code Online (Sandbox Code Playgroud)
但是日志目录是空的......我错过了什么?所有的日志信息在哪里?
我还确保所有脚本都是可执行的。
似乎sv
由于某种原因无法启动日志记录脚本!
$ sv s test
run: test: (pid 14612) 5s; down: log: 0s, normally up, want up
Run Code Online (Sandbox Code Playgroud)
如果要停止日志记录脚本,则必须发出:
$ sv d test/log
Run Code Online (Sandbox Code Playgroud)
因此,经过一番尝试和错误后,我找到了解决方案。
以下几点是需要注意的:
/etc/sv/test
,并且在下有一个日志记录目录,那么/etc/sv/test/log
您希望该目录config
位于/etc/sv/test/log/config
!但请注意,该文件是从您运行的位置读取的svlogd
。这意味着:如果您的日志脚本在/var/log/test
( 的最后一个参数svlogd
)中运行,那么这就是配置文件的预期位置。var/log/test/config
所以在List item中写下你的配置Run Code Online (Sandbox Code Playgroud)$ sv down test/log $ sv start test/log ok: run: test/log: (pid 21190) 0s
在您的问题中有许多与问题无关的事情要解决(咳嗽pid 文件咳),但让我们正确地解决这个问题。
首先,日志记录是可选的。虽然在大多数情况下您需要一个记录器,但没有硬性要求为您的服务定义提供记录器。
其次,因为记录器实际上从属于您的服务,所以./log
保存记录所需的设置是有意义的。
第三,当您关闭服务时,记录器会出于某种原因继续运行 - 它会在服务终止之前捕获剩余数据。这样做是为了防止日志数据丢失,不仅在服务关闭时,而且在服务崩溃时也是如此。 即使服务关闭,记录器仍然运行是正常的。 启动服务只会将新服务实例重新连接到现有记录器。
第四,你是对的,你可以通过使用sv
命令显式命名来停止记录器。这符合现有的daemontools
范式。
第五,除非你有注册svlogd程序失败的异常需求(极不可能),否则你不必担心杀死它等。简单地向它发出信号将导致runsv
监督进程终止它,没有PID或kill
需要的命令。
如果您还有其他问题,我建议您联系监督邮件列表,它噪音低,有很多知识渊博的人来回答您的问题。也可以在mail-archive.org上找到只读镜像。
归档时间: |
|
查看次数: |
14948 次 |
最近记录: |