我对 runit 还很陌生。我把它安装在 Ubuntu 主机上。
我做了什么:
testrun
1)在中创建一个目录/etc/sv
run
2)在中创建脚本/etc/sv/testrun/run
,脚本内容:
#! /bin/bash
exec /root/FP/annotate-output python /root/FP/test.py | logger -t svtest
3)如果我直接调用/etc/sv/testrun/run,它会成功执行
4)我运行sv start testrun
(或sv run testrun
,sv restart testrun
),它们都出现相同的错误消息:
fail: sv: unable to change to service directory: file does not exist
知道我做错了什么吗?我是 runit 的新手,我的所有操作均基于此处找到的信息: http://smarden.org/runit/
答案1
您的服务设置不正确。它之所以能正常工作,是因为您直接从服务调用了它定义而不是来自实际的服务控制。
当 runit 的服务管理启动时,它期望一个/service
目录存在,尽管某些安装(如 Debian Jessie)目前/etc/service
出于未知原因而将其保留在目录中。错误消息来自这个缺失的目录,它正在尝试更改到该目录,因此出现该unable to change service directory
消息。以 root 身份执行以下操作:
mkdir -p /etc/service
cd /
ln -s /etc/service
cd /service
ln -s /etc/sv/testrun
这会:
- 如果不存在则创建服务目录
- 在根目录中放置一个符号链接,以便 runsvdir 能够更改
/service
为其工作目录 - 创建指向您服务的链接
testrun
,假设您已在以下位置定义该服务/etc/sv/testrun
runsvdir
然后就可以将其目录更改为/service
,找到 的符号链接testrun
,然后启动它。您可以使用ps fax
或pstree -A
查看进程树来验证这一点;应该有一个runsv
附加了命令的 。 注意:runsvdir 进程有时可能需要一两秒钟才能定位到它的头部,因此如果您立即查看却在进程树中看不到它,请等待 2-3 秒后重试,它应该会出现。这似乎只在启动时发生。
答案2
似乎sv
控制由 启动和监视的服务runit
(使用runsv
)。由于我的机器上的 runit 实际上并未替换sysvinit
,因此它不会运行也不会监视 ,而/services/
应该包含指向/etc/sv/
目录的符号链接。
运行runsv /etc/sv/testrun/
似乎实现了预期的 runit 行为。