sudo nohup nice <-- 这些命令应该按照什么顺序使用?

22

我有一个脚本想要以root身份运行,不希望被挂起且能够平滑地运行,应该按照什么顺序编写命令?

sudo nohup nice foo.bash &

还是

nohup nice sudo foo.bash &

等等。

我猜这并不重要,但我希望从那些真正了解的人那里得到一些见解。

6个回答

13
如果需要负的优先级值,我会这样做: sudo nohup nice command 因为根据 “info coreutils”,nohup 应该在 nice 命令之前。如果我想要负的优先级值,sudo 必须在前面,因为只有 root 用户才能使用负的优先级值。
如果需要正的优先级值,我会简单地执行以下命令: nohup nice sudo command 这确保了 nohup 和 nice 不以 root 权限运行。

12

sudo可能不会遵守niceness(进程优先级)。至少在我的机器上(Ubuntu 9.04)是这样的。运行以下命令:

nice sudo nice
sudo nice nice

输出0和10。(注意,不带命令的“nice”会输出当前优先级。)


每个其他答案都错了。Debian Squeeze也是一样的:niceness不能通过sudo保持。这太遗憾了,因为一个细粒度的sudoers将会很好地阻止允许的命令运行。 - Steve Madsen

6
~ $ sudo nohup nice whoami
nohup: ignoring input and appending output to `nohup.out'
~ $ sudo cat nohup.out 
root

你所做的第一种和第二种方式之间的区别在于谁拥有nohup.out文件。先使用sudo会使其归属于root用户,而先使用nohup再使用sudo则会使其归属于你的用户。

5
sudo 应该放在最后,这样 nohup 和 nice 不会以 root 权限运行。
因此,后者。

3

不同意其他回答。我的建议是:

sudo nohup nice foo.sh

我发现nohup sudo #失败了——也就是说,在使用sudo的子子进程中,并不总是能够传递nohup(这对于Ubuntu上的某些/etc/init.d脚本委派给其他脚本的情况是成立的)。不知道为什么,但确实让人惊讶,并且花费了很长时间来调试。

(我注意到其他人报告说niceness没有被传递,所以似乎最好把它放在最后...尽管如果你的操作系统有疑问,还是把nice放在前面比较好,因为nice不起作用通常比nohup不起作用要少出问题!)

请注意,sudo nohup会将nohup.out归root所有,正如已经提到的那样,但可以通过以下方式进行修复:

sudo nohup nice foo.sh >> /tmp/foo.stdout.log 2>> /tmp/foo.stderr.log


1

我猜他们都会执行一个exec*系统调用来将球传递给下一个人,所以无论顺序如何,都不会留下任何挂起的进程。

我认为nohup应该放在最后,这样另外两个就不会破坏信号处理程序。(我确定nice不会与信号一起玩耍,但sudo会。)

然后,sudo和nice,这完全取决于您想用什么方式用nice更改调度优先级。

  • 如果要提高优先级(即为nice分配负值),请先使用sudo。
  • 如果要降低优先级(给nice分配正值),请在sudo之前进行,因为您不需要root权限。

谢谢您的回复。您能详细说明一下sudo如何与信号交互吗?(或者提供一个链接 :) 谢谢! - Jonah Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接