如何在 Upstart 中以非特权用户身份启动作业?

如何在 Upstart 中以非特权用户身份启动作业?

我正在使用 ubuntu 10.4 LTS 的最新版本 upstart。upstart 使用 --debug 内核标志启动。

我正在为 nzbget 守护进程创建自定义作业配置。基本上,此作业有一个用于挂载文件系统的启动前脚本、一个用于卸载文件系统的启动后脚本和一行exec nzbget -D

问题是 nzbget 守护进程需要以非特权用户身份运行。该功能已包含在 nzbget 中。事实上,当我从控制台运行时,sudo nzbget -D进程以非特权用户身份运行。但是当我使用该exec nzbget -D行启动 upstart 作业时,进程 nzbget -D 以 root 身份运行。正如 upstart cookbook 中所述,我尝试使用 su -c "nzbget -D" 用户和 start-stop-daemon,两者都没有建议的 expect 节。但对于这两个命令,我猜是因为 upstart 跟踪了错误的 PID,它在启动过程结束时将主进程视为已终止(由于 upstart 日志),因此,它会启动我不想要的后处理脚本。

=> 我该怎么做才正确?为什么exec nzbget -Dupstart 命令使进程以 root 身份运行,而sudo nzbget -Dcommand 却使其以非特权用户身份运行?

答案1

1.4 版的发布取得了一些进展:

新的“setuid”和“setgid”节允许系统作业在对应于给定名称/组的特定 uid/gid 下运行。

您可以从他们的 LaunchPad 页面但(奇怪的是)我看不到 PPA,所以你可能必须自己编译它。

否则,在 exec 命令中使用su或,如下所示:sudo

su -c "<commands>" <username>
sudo -u <username> <commands>

它们的作用基本相同,因此请选择您最满意的那个。因此使用您的示例命令:

exec sudo -u me "nzbget -D"

答案2

我建议使用 sudo 的语法如下:

sudo -u foouser foocommand

这将以用户 foouser 的身份运行命令 foocommand。

相关内容