在某些情况下,我希望减少正在运行的进程优先级以执行costy操作,然后将其增加回原始值。该过程应该在没有root权限的情况下单独执行 。
我在Process.setpriority
的红宝石应用中尝试过这个。
这不是内核设计的缺陷吗?
这是shell中的一个例子:
$ nice
0
然后
$ renice -n 19 -p $$
5094 (process' ID) old priority 0, new priority 19
然后
$ renice -n 0 -p $$
renice: failed to set priority for 5094 (process' ID): Permission denied
答案 0 :(得分:3)
通常只有root(或具有CAP_SYS_NICE权限的进程)可以将其“nice”更改为更高优先级(更低的值)。但是自2.6.12版本的内核(http://man7.org/conf/lca2006/Linux_2.6_changes/rlimit_5.html)以来,linux引入了增加优先级(降低好看)的额外方法,即RLIMIT_NICE rlimit(man getrlimit)。您可以在bash中使用ulimit -e
进行检查,然后在切换(su)到普通用户或无人(example)之前按root更改。
那么,你怎么做才能使你的过程暂时具有低优先级(更高的好价值):
ulimit -e VALUE
,也可以是系统范围/etc/security/limits.conf
,项目nice
(此配置由pam_limits.so
PAM模块使用,因此检查是否在启动进程之前调用。通常由login,* dm managers,crond和atd调用。不知道是否需要进程调用由init.d脚本启动)来自brauliobo的第二个变体的两个示例,允许在系统范围内返回0。添加到/etc/security/limits.conf
:
* soft nice 0 # ranges from -20 to 19
或使用sudo
root来更改单个shell的RLIMIT_NICE:
sudo bash
ulimit -e 20 # equivalent to 0, as it ranges from 0 to 40
sudo -u youruser bash
# now you can renice back to 0
如果没有root用户的帮助,您可以:
sched_yield
。这将使其他进程能够提前抢占您的程序。