我想在使用 PC 时在后台启动一项漫长、复杂的 CPU 和 IO 繁重的命令行工作。如果我以正常优先级运行它,它将阻碍系统的响应能力。如何启动一个 shell(作业将在该 shell 下执行),所有进程都从其中运行,并且它们运行的进程具有低优先级?
答案1
要在优先级较低的进程中执行命令,无论该命令是 shell 还是繁重命令(本身也可以是 shell 脚本),在 Linux 上您可以执行以下操作:
nice ionice -c idle the-command and its arguments
nice
是标准的,ionice
是 Linux 特定的。
要运行某些 shell 代码,请使用sh -c
以下命令:
nice ionice -c idle sh -c '
for i in foo bar; do
heavycmd "$i" > "$i.log"
done'
nice
单独增加好感度10
,您可以使用该选项指定不同的增量-n
。
在zsh
shell 中,您可以设置该bgnice
选项(交互时默认打开),以便所有在后台运行的命令的好感度增加 5。
在(t)csh
shell 中,nice
是一个内置命令,它还可以更改 shell 的友好度(请注意,语法与nice
标准命令不同(nice +10 cmd
指定任意友好度(不是增量!)),默认友好度为 4)。
在不支持自行更改其自身友好度的 shell 中,您可以改为使用renice
。当心renice -n 5 "$pid"
目前 POSIX 要求减少id 进程的好度$pid
增 5,但这不是我所知道的任何实现中发生的情况,并且很明显是漏洞在 POSIX 规范 1 中。在实践中,它要么将好感度设置为 5²,要么增加5.
在实践中,renice -n 20 "$pid"
假设友好度一开始就不是负数,那么至少在 Linux 上会将友好度设置为最高值。
请注意nice
(在 70 年代中期的 Unix V4 中引入)最初没有采用任何数字参数。 Unix V7 和 csh(基于 V6 的 BSD)中独立添加了数字参数,但做法不同。在 V7 中,nice -5 cmd
将 Niceness 增加了 5,而在 csh 中(如上所示),这会将其设置为-5
.renice
最初来自 BSD,与 csh 一致nice
(renice +5 "$pid"
将好感度设置为 5)。
这段历史解释了为什么如今,在世界之外csh
,nice -5
友善度会增加或renice -5
减少。我怀疑-n
这是一个 POSIX 发明(例如 for head -n
),其引入是为了摆脱带有前导的选项名称+
,并尝试使用一个干净的 API(niceness 值也是不可移植的,因此处理增量更有意义)。
ionice
其他任意进程的 I/O 优度也可以通过和 其-p
选项进行更改。
因此,从 shell 内部(这里是类似于 Bourne 的 shell),您可以使用以下命令更改执行 shell 解释器的进程的优劣:
renice -n 20 "$$"
ionice -c idle -p "$$"
或者更改当前子 shell 的良好程度:
(
pid=$(sh -c 'echo "$PPID"')
renice -n 20 "$pid"
ionice -c idle -p "$pid"
# do stuff in the subshell with lower priority / higher niceness
)
在bash
shell 中,您还可以使用 和$BASHPID
in zsh
with $sysparams[pid]
(在 后面zmodload zsh/system
)获取当前子 shell pid。请注意,ksh93
shell 不会实现带有子进程的子 shell 环境,因此上述内容会影响全局的良好性。
1 引入于SUSv3, 这以前的版本(还指定了原始renice
API(已过时))正确地表示正值降低了优先事项,不是友善
² 就像在util-linux
实现中一样。这是一个漏洞。-n
2009年添加为了 POSIX 一致性,但维护者没有意识到这-n
需要增量在 POSIX 规范中。帮助消息自2010年以来确实指的是增量,但事实并非如此。