如何确定我的服务是否正在使用runit
或init
?我使用Ubuntu 10.0.4。
如nginx、chef、puppet等。
答案1
pstree
给我流程如下,
$ pstree
init-+-VBoxService---7*[{VBoxService}]
|-acpid
|-atd
|-cron
|-dbus-daemon
|-2*[dhclient3]
|-5*[getty]
|-login---bash---sudo---su---bash---pstree
|-nginx---4*[nginx]
|-rsyslogd---3*[{rsyslogd}]
|-runsvdir-+-runsv---node---{node}
| |-runsv---java---9*[{java}]
| `-runsv
|-sshd
|-udevd---2*[udevd]
|-upstart-socket-
|-upstart-udev-br
`-whoopsie---{whoopsie}
我想,这样一来,就可以决定了。
答案2
我不完全确定,但自从runit
使用主管,您应该能够通过查看进程树来识别它,即从ps faux
or 的输出(如果已安装)pstree
。
你也可以只是问runit
,即运行sv status nginx
。
但请注意,如果您所做的只是安装runit
,可能什么也没有得到切换到使用它而不是“普通” init
。您可以检查/proc/cmdline
是否出现init=/sbin/runit-init
.
答案3
如果您需要您的具有通用控制接口的服务,最好用sv
命令模仿 init.d 脚本行为。如果sv
被称为 a /etc/init.d/NAME command
,它会自动将其转换为sv command NAME
.
如果您在主管下运行某些服务(假设是 ssh)runit
,您可以执行以下操作:
重命名当前初始化脚本:
dpkg-divert --rename /etc/init.d/ssh
创建具有相同名称的符号链接:
ln -vs $(which sv) /etc/init.d/ssh
现在您可以使用熟悉的命令来管理您的服务,如下所示:
/etc/inti.d/ssh status
invoke-rc.d ssh status
不过,拥有符号链接会引起一些关于 LSB 标头的抱怨。因此,最好不要使用符号链接,而是创建一个如下所示的包装器脚本:
#!/bin/sh
### BEGIN INIT INFO
# copy these headers from your original script which
# can be found at /etc/init.d/ssh.distrib
### END INIT INFO
exec /usr/bin/chpst -b $0 /usr/bin/sv "$@"
这样,您就可以以相同的方式管理服务,无论它们是否处于运行状态runit
。