如何启动 shell 以便所有进程都从其中运行并且它们运行的​​进程具有低优先级?

如何启动 shell 以便所有进程都从其中运行并且它们运行的​​进程具有低优先级?

我想在使用 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

zshshell 中,您可以设置该bgnice选项(交互时默认打开),以便所有在后台运行的命令的好感度增加 5。

(t)cshshell 中,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 一致nicerenice +5 "$pid"将好感度设置为 5)。

这段历史解释了为什么如今,在世界之外cshnice -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
)

bashshell 中,您还可以使用 和$BASHPIDin zshwith $sysparams[pid](在 后面zmodload zsh/system)获取当前子 shell pid。请注意,ksh93shell 不会实现带有子进程的子 shell 环境,因此上述内容会影响全局的良好性。


1 引入于SUSv3, 这以前的版本(还指定了原始reniceAPI(已过时))正确地表示正值降低了优先事项,不是友善

² 就像在util-linux实现中一样。这是一个漏洞-n2009年添加为了 POSIX 一致性,但维护者没有意识到这-n需要增量在 POSIX 规范中。帮助消息自2010年以来确实指的是增量,但事实并非如此。

相关内容