我正在为 ubuntu 10.4 LTS 使用最新的暴发户版本。upstart 使用 --debug 内核标志启动。
我正在为 nzbget 守护程序进行自定义作业配置。基本上,这个作业有一个挂载文件系统的启动前脚本、一个卸载文件系统的启动后脚本和exec nzbget -D一行。
问题是 nzbget 守护进程需要作为非特权用户运行。此功能已包含在 nzbget 中。实际上,当我从控制台运行时,sudo nzbget -D该进程以非特权用户身份运行。但是当我用这exec nzbget -D条线开始新贵的工作时,进程 nzbget -D 以 root 身份运行。正如新贵食谱中所说,我尝试使用 su -c "nzbget -D" 用户和 start-stop-daemon 两者都没有按照建议的期望节。但是对于这两个命令,当 upstart 跟踪错误的 PID 时,我猜它会在启动过程结束时看到主进程被杀死(由于 upstart 日志),因此,它启动了我不想要的后处理脚本。
=> 我怎样才能做对?exec nzbget -Dupstart 命令如何使进程以 root 身份运行而sudo nzbget -Dcommand 使其以非特权用户身份运行?
Oli*_*Oli 12
1.4 版的发布取得了一些进展:
新的“setuid”和“setgid”节允许系统作业在与给定名称/组对应的指定 uid/gid 下运行。
您可以从他们的 LaunchPad 页面获取它,但(奇怪)我看不到 PPA,因此您可能必须自己编译它。
否则,在您的 exec 命令中使用su或sudo,如下所示:
su -c "<commands>" <username>
sudo -u <username> <commands>
Run Code Online (Sandbox Code Playgroud)
他们都做几乎相同的事情,所以选择你最满意的那个。因此,使用您的示例命令:
exec sudo -u me "nzbget -D"
Run Code Online (Sandbox Code Playgroud)
我建议使用 sudo 并使用以下语法:
sudo -u foouser foocommand
Run Code Online (Sandbox Code Playgroud)
这将以用户 foouser 的身份运行命令 foocommand。