如何啟動一個 shell,以便所有程序在其中執行並且它們執行的程序具有低優先級?
我想在使用 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
在
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 解釋器的程序的友好性:
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
和 inzsh
with$sysparams[pid]
(afterzmodload zsh/system
) 獲取目前子shell pid。請注意,ksh93
shell 不會使用子程序實現子 shell 環境,因此上述內容會影響全域的友好性。¹ 那是在SUSv3中引入的,以前的版本(也指定了原始
renice
API(作為過時的))正確地表示正值會降低優先級,而不是友好² 喜歡在
util-linux
執行中。那是一個錯誤。-n
在 2009 年為了 POSIX 一致性而添加,但維護者沒有意識到這-n
需要 POSIX 規範的增量。自 2010 年以來的幫助消息確實提到了一個increment,但事實並非如此。