我想在使用 PC 时在后台启动一个漫长而复杂的 CPU 和 IO 繁重的命令行工作。如果我以正常优先级运行它,它将阻碍系统的响应能力。如何以所有进程从其中运行并且它们运行的进程的优先级较低的方式启动一个 shell(将在该 shell 下执行作业)?
我想在使用 PC 时在后台启动一个漫长而复杂的 CPU 和 IO 繁重的命令行工作。如果我以正常优先级运行它,它将阻碍系统的响应能力。如何以所有进程从其中运行并且它们运行的进程的优先级较低的方式启动一个 shell(将在该 shell 下执行作业)?
要在优先级较低的进程中执行命令,无论该命令是 shell 还是您的繁重命令(其本身也可能是 shell 脚本),在 Linux 上,您可以执行以下操作:
nice
是标准的,ionice
是特定于 Linux 的。要运行一些 shell 代码,请使用
sh -c
以下命令:nice
单独增加 niceness ,您可以使用该选项10
指定不同的增量。-n
在
zsh
shell 中,您可以设置bgnice
选项(交互时默认打开),以便所有在后台运行的命令的 niceness 增加 5。在
(t)csh
shell 中,nice
是一个内置函数,它也可以更改 shell 的 niceness(注意语法与nice
标准命令不同(nice +10 cmd
指定任意 niceness(而不是增量!)),默认 niceness 为 4)。在不支持自行更改自身友好的 shell 中,您可以
renice
改用。请注意,renice -n 5 "$pid"
POSIX 目前要求将 id 进程的友好性降低$pid
5,但这不是我知道的任何实现中发生的情况,而且很明显是POSIX 规范中的一个错误¹。在实践中,它要么将 niceness 设置为 5²,要么将其增加5。在实践中,
renice -n 20 "$pid"
首先假设 niceness 不是负数,至少在 Linux 上会将 niceness 设置为最高值。请注意
nice
(在 70 年代中期的 Unix V4 中引入)最初没有采用任何数字参数。在 Unix V7 和 csh(基于 V6 的 BSD)中独立添加了一个数字参数,但执行方式不同。在 V7 中,nice -5 cmd
在 csh 中将 niceness 增加了 5(如上所示),这会将其设置为-5
.renice
最初来自 BSD,并且与 csh 一致nice
(renice +5 "$pid"
将 niceness 设置为 5)。那段历史解释了为什么现在,在 之外
csh
,nice -5
增加和renice -5
减少它。我怀疑-n
这是一项 POSIX 发明(如 forhead -n
),旨在摆脱带有前导的选项名称+
并尝试使用干净的 API(niceness 值也不可移植,因此处理增量更有意义)。其他任意进程的 I/O 友好度也可以通过
ionice
其-p
选项进行更改。因此,在 shell(此处为 Bourne-like shell)中,您可以更改执行 shell 解释器的进程的友好性:
或者改变当前子shell的好处:
在
bash
shell 中,您还可以使用$BASHPID
和 inzsh
with$sysparams[pid]
(afterzmodload zsh/system
) 获取当前子shell pid。请注意,ksh93
shell 不会使用子进程实现子 shell 环境,因此上述内容会影响全局的友好性。¹ 那是在SUSv3中引入的,以前的版本(也指定了原始
renice
API(作为过时的))正确地表示正值会降低优先级,而不是友好² 喜欢在
util-linux
执行中。那是一个错误。-n
在 2009 年为了 POSIX 一致性而添加,但维护者没有意识到这-n
需要 POSIX 规范的增量。自 2010 年以来的帮助消息确实提到了一个increment,但事实并非如此。