我正在使用 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 -D
upstart 命令使进程以 root 身份运行,而sudo nzbget -D
command 却使其以非特权用户身份运行?
答案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。