为什么不能使用renice来增加流程的价值?


25

来自man renice

超级用户以外的用户只能更改其拥有的进程的优先级,并且只能在0到PRIO_MAX(20)的范围内单调增加其“ nice值”(出于安全原因)[...]

因此,我可以将renice自己的进程向上(给它们较低的优先级),但从不向下:

$ renice 10 22316
22316 (process ID) old priority 0, new priority 10
$ renice 9 22316
renice: failed to set priority for 22316 (process ID): Permission denied

为什么是这样?我能理解为什么普通用户不能将漂亮的值设置为小于0的原因,但是为什么可以将优先级降低到10却又不能将其提高到9?这有什么“安全原因”?我有权启动一个值为9的进程,那么为什么我不能将其降为9?


编辑:我应该学会向下滚动。事实证明,这已列为bug man renice

BUGS
     Non super-users can not increase scheduling priorities of their own
     processes, even if they were the ones that decreased the priorities 
     in the first place.

更令人困惑。如果他们认为此行为是错误,那么为什么不更改它呢?该renice命令出现在我认为是1980年的4.0BSD中。此命令应该很容易修复,因此一方面他们似乎选择保留它,另一方面将其列为错误。


因为某些高于0的优先级可能是由系统进程或安全模块强制执行的,并且永远不应该由用户降低(并且除了固定值0之外,没有足以定义给定用户进程最小舒适度的控件) ?我不确定,不是答案,而是猜测。
lgeorget 2014年

Answers:


19

从linux 2.6.12开始,这取决于RLIMIT_NICE limit(ulimit -e)的值。可以取0到40之间的值。该限制是对进程优先级的限制(该数字越大,用户可以为进程设置的优先级越高)。

您会注意到默认值在ubuntu 10.04上为20,在Debian jessie中为0。

的值n对于该限制的装置,如果没有CAP_NICE能力的过程只能增加一个过程的优先级,以达到n,该装置减少nice值下降到的nice值20 - n。因此,对于值为0的情况,这意味着没有任何特权用户都不能将友好度降低到20以下,因此没有特权用户都不能降低其吸引力。

值为20时,非特权用户可以将美观度降低为0。

管理员可以选择是否允许用户降低流程优先级,以及通过为此设置硬限制来降低级别。

关于管理员为什么不希望用户降低其处理优先级的原因,请参见Flup的答案


1
啊! 因此它是可配置的!好的,谢谢。
terdon

“值从0到40。[...]您会注意到ubuntu 10.04的默认值为20,而Debian jessie的默认值为0。” ->对我来说,有趣的硬/软限制在debian jessie上确实为0。我最多可以筹集20个,但除此之外,我会收到“ bash:ulimit:调度优先级:无法修改限制:无效的参数”,也不接受负值。
thomanski '16

20

这就是我所说的政策原因。这个想法是普通用户不能覆盖特权用户的操作。

假设您是某个巨大的共享服务器上的用户。您正在运行耗费大量CPU资源的进程,从而损害了其他用户的利益。系统管理员会执行renice一些流程,因为他不太喜欢您。操作系统不记得是谁做的renice,但它确实知道普通用户无法撤消该操作。这样,系统管理员可以控制普通用户的进程优先级。


1
我可以理解,但这仍然很奇怪。实际上,我只是意识到它甚至被列为的bug man renice
terdon

3
我认为该错误的要点是“非超级用户不能增加自己进程的调度优先级,即使他们首先降低了优先级也是如此 ”。即,这种强制执行的副作用是renice,只有特权用户才能恢复意外事件。
2014年

7
因为系统不记得谁设置了优先级。理想情况下,如果您提高了不错的水平,然后又想降低它,那是允许的……但是系统强加了全面禁止,因为它不会保留谁喜欢什么的记录,因此您无法撤消reniceroot确实。
2014年

1
@IwillnotexistIdonotexist认为系统具有许多用户。系统管理员可能希望将您的进程的优先级提高到5,而将我的进程的优先级降低到10。这仍然在普通用户的范围内,但我将无法更改它并窃取您应得的CPU时间。就像Flup解释的那样,这就是想法。但是,正如StephaneChazelas所解释的那样,这是可配置的,因此,由系统管理员来选择他们喜欢的东西。
terdon

1
对于“为什么?”的答案很可能是“因为没有人需要足够的代码来编写它来修复它。”最初编写Unix时,跟踪谁设置进程的优先级可能代价很高。内存使用情况和工作,更新它,但在现代化的机器,这是可以忽略不计,只留下动力不足编写代码来跟踪这个对于想保持原有政策的网站“的用户不能覆盖系统管理员。”
alanc

-1

奇怪吗 它对我有效

Linux clafujiu 2.6.32-57-generic #119-Ubuntu \
 SMP Wed Feb 19 01:04:55 UTC 2014 i686 GNU/Linux

$ renice 8 --pid 21122
21122: old priority 9, new priority 8
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122   8
21146   0
21155   0
21209   0
christian@clafujiu:~/tmp$ renice 15 --pid 21122
21122: old priority 8, new priority 15
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  15
21146   0
21155   0
21211   0
christian@clafujiu:~/tmp$ renice 10 --pid 21122
21122: old priority 15, new priority 10
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  10
21146   0
21155   0
21213   0

第二次编辑

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

配置变更

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

我是音频组的成员,这是为了减少录制时的插孔/损耗和缓冲区xruns的延迟。

伦尼斯

$ renice --version
renice from util-linux-ng 2.17.2

你在发行什么?它不在AIX 6.2
Kiwy 2014年

请张贴的输出cat /etc/lsb*renice --version为好。
terdon

renice --version renice from util-linux-ng 2.17.2但仍无法在AIX上运行
Kiwy 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.