每个用户的服务

有时候,拥有针对用户的runit服务是很好的。例如,你可能想以当前用户的身份打开一个ssh隧道,运行一个虚拟机,或者以你的名义运行守护程序。最常见的方法是创建一个系统级服务,以你的用户身份运行runsvdir(8) 。以便启动和监控个人目录中的服务

例如,你可以创建一个名为 /etc/sv/runsvdir-<username> 的服务,其 run` 如下,它应该是可执行的。

#!/bin/sh

export USER="<username>"
export HOME="/home/<username>"

groups="$(id -Gn "$USER" | tr ' ' ':')"
svdir="$HOME/service"

exec chpst -u "$USER:$groups" runsvdir "$svdir"

在这个例子中,chpst(8) 被用来以指定的用户身份启动一个新的 runsvdir(8) 进程。chpst(8) 不会自己读取组,而是期望用户列出所有由 : 隔的所需组。idtr 管道被用来以 chpst(8) 理解的方式创建一个所有用户组的列表。注意,我们 export 了 $USER$HOME,因为有些用户服务没有它们可能无法工作。

然后,用户可以在 /home/<username>/service 目录中创建新的服务或它们的符号链接。为了使用 sv(8) 命令控制服务,用户可以通过路径指定服务,如果 SVDIR 环境变量被设置为用户的服务目录,也可以通过名称指定服务。这在下面的例子中显示:

$ sv status ~/service/*
run: /home/duncan/service/gpg-agent: (pid 901) 33102s
run: /home/duncan/service/ssh-agent: (pid 900) 33102s
$ SVDIR=~/service sv restart gpg-agent
ok: run: gpg-agent: (pid 19818) 0s

在你的 shell 配置文件中 export SVDIR=~/service 变量可能比较方便。