Linux

如何啟動一個 shell,以便所有程序在其中執行並且它們執行的程序具有低優先級?

  • July 5, 2021

我想在使用 PC 時在後台啟動一個漫長而復雜的 CPU 和 IO 繁重的命令行工作。如果我以正常優先級執行它,它將阻礙系統的響應能力。如何以所有程序從其中執行並且它們執行的程序的優先級較低的方式啟動一個 shell(將在該 shell 下執行作業)?

要在優先級較低的程序中執行命令,無論該命令是 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單獨增加 niceness ,您可以使用該選項10指定不同的增量。-n

zshshell 中,您可以設置bgnice選項(互動時預設打開),以便所有在後台執行的命令的 niceness 增加 5。

(t)cshshell 中,nice是一個內置函式,它也可以更改 shell 的 niceness(注意語法與nice標準命令不同(nice +10 cmd指定任意 niceness(而不是增量!)),預設 niceness 為 4)。

在不支持自行更改自身友好的 shell 中,您可以renice改用。請注意,renice -n 5 "$pid"POSIX 目前要求將 id 程序的友好度降低$pid5,但這不是我所知道的任何實現中發生的情況,而且很明顯是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 一致nicerenice +5 "$pid"將 niceness 設置為 5)。

那段歷史解釋了為什麼現在,在 之外cshnice -5增加和renice -5減少它。我懷疑-n這是一項 POSIX 發明(如 for head -n),它被引入以擺脫帶有前導的選項名稱+並嘗試使用乾淨的 API(niceness 值也不可移植,因此處理增量更有意義)。

其他任意程序的 I/O 友好度也可以通過ionice-p選項進行更改。

因此,在 shell(此處為 Bourne-like 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 中,您還可以使用$BASHPID和 in zshwith $sysparams[pid](after zmodload zsh/system) 獲取目前子shell pid。請注意,ksh93shell 不會使用子程序實現子 shell 環境,因此上述內容會影響全域的友好性。


¹ 那是在SUSv3中引入的,以前的版本(也指定了原始reniceAPI(作為過時的))正確地表示正值會降低優先級,而不是友好

² 喜歡在util-linux執行中。那是一個錯誤-n在 2009 年為了 POSIX 一致性而添加,但維護者沒有意識到這-n需要 POSIX 規範的增量自 2010 年以來的幫助消息確實提到了一個increment,但事實並非如此。

引用自:https://unix.stackexchange.com/questions/541673