Process

如何修改一組程序?

  • May 24, 2021

lb build可以建構實時系統映像,並且在建構映像時會呼叫許多程序。如果我按以下方式啟動它:

# nice -n 19 ionice -n 7 -c 3 lb build

所有子程序都獲得相同的良好級別:

 PID USER       IORR  IOWR    IO IO PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command                                                 
26196 morfik        0     0     0 B4  20   0 23888   672   668 S  0.0  0.1  0:00.24 │  ├─ -bash
30926 root          0     0     0 B4  20   0 53668   536   536 S  0.0  0.1  0:00.02 │  │  └─ su -
31008 root          0     0     0 B4  20   0 34656  6260  1144 S  0.0  0.6  0:02.60 │  │     └─ -su
11784 root          0     0     0 ??  39  19  4496   796   524 S  0.0  0.1  0:00.01 │  │        └─ /bin/sh /usr/lib/live/build/build               
11797 root          0     0     0 ??  39  19  4328   612   512 S  0.0  0.1  0:00.00 │  │           └─ /bin/sh ./auto/build
11806 root          0     0     0 ??  39  19  7028   604   504 S  0.0  0.1  0:00.00 │  │              ├─ tee build.log
11798 root          0     0     0 ??  39  19  4496   824   532 S  0.0  0.1  0:00.01 │  │              └─ /bin/sh /usr/lib/live/build/build noauto  
11915 root          0     0     0 ??  39  19  4496   836   544 S  0.0  0.1  0:00.01 │  │                 └─ /bin/sh /usr/lib/live/build/bootstrap  
12753 root          0     0     0 ??  39  19  4496   856   548 S  0.0  0.1  0:00.02 │  │                    └─ /bin/sh /usr/lib/live/build/bootstra
12867 root          0     0     0 ??  39  19 62980  3508  2132 S 11.2  0.3  0:07.00 │  │                       └─ aptitude --assume-yes update
12943 root          0     0     0 ??  39  19 24296  1916  1568 S  0.0  0.2  0:00.14 │  │                          ├─ /usr/lib/apt/methods/xz
12927 root          0     0     0 ??  39  19 53280 30688 30172 R 86.5  3.0  0:28.65 │  │                          ├─ /usr/lib/apt/methods/rred
12891 root          0     0     0 ??  39  19 24304  1784  1440 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/gpgv
12889 root          0     0     0 ??  39  19 24292  1624  1384 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/copy
12887 root          0     0     0 ??  39  19 32860  1956  1560 S  0.0  0.2  0:00.17 │  │                          ├─ /usr/lib/apt/methods/http
12886 root          0     0     0 ??  39  19 24292  1696  1444 S  0.0  0.2  0:00.00 │  │                          └─ /usr/lib/apt/methods/fil

但我忘了添加這個nice -n 19 ionice -n 7 -c 3,就跑了lb build。所以,我嘗試renice了父程序:

# renice -n 19 -p 6187

但這並沒有削弱其他程序。所以,它看起來像這樣:

26196 morfik        0     0     0 B4  20   0 23888   668   664 S  0.0  0.1  0:00.24 │  ├─ -bash
30926 root          0     0     0 B4  20   0 53668   528   528 S  0.0  0.1  0:00.02 │  │  └─ su -
31008 root          0     0     0 B4  20   0 34656  5952  1224 S  0.0  0.6  0:02.62 │  │     └─ -su
6187 root          0     0     0 B7  39  19  4496   800   524 S  0.0  0.1  0:00.00 │  │        └─ /bin/sh /usr/lib/live/build/build
6349 root          0     0     0 B4  20   0  4328   612   512 S  0.0  0.1  0:00.00 │  │           └─ /bin/sh ./auto/build
6351 root          0     0     0 B4  20   0  7028   592   488 S  0.0  0.1  0:00.00 │  │              ├─ tee build.log
6350 root          0     0     0 B4  20   0  4496   828   532 S  0.0  0.1  0:00.01 │  │              └─ /bin/sh /usr/lib/live/build/build noauto  
6445 root          0     0     0 B4  20   0  4496   840   548 S  0.0  0.1  0:00.00 │  │                 └─ /bin/sh /usr/lib/live/build/bootstrap  
7580 root          0     0     0 B4  20   0  4496   856   552 S  0.0  0.1  0:00.02 │  │                    └─ /bin/sh /usr/lib/live/build/bootstra
7692 root          0     0     0 B4  20   0 62924  5236  3848 S 15.5  0.5  0:03.78 │  │                       └─ aptitude --assume-yes update
7932 root          0     0     0 B4  20   0 54776 16480 15916 R 84.1  1.6  0:16.60 │  │                          ├─ /usr/lib/apt/methods/rred
7912 root          0     0     0 B4  20   0 24296  2036  1648 S  0.0  0.2  0:01.62 │  │                          ├─ /usr/lib/apt/methods/gzip
7733 root          0     0     0 B4  20   0 27948  5552  1632 S  0.0  0.5  0:02.85 │  │                          ├─ /usr/lib/apt/methods/bzip2
7711 root          0     0     0 B4  20   0 24304  1780  1436 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/gpgv
7709 root          0     0     0 B4  20   0 30800  2200  1812 S  0.0  0.2  0:01.01 │  │                          └─ /usr/lib/apt/methods/http     

我可以手動修改所有流程,但它們正在發生變化。

編輯#1

以下命令:

# nice -n 19 ionice -n 7 -c 3 lb build

還設置:

ionice - 設置或獲取程序 io 調度類和優先級。…

-c, –class 調度類名或編號 0:無,1:實時,2:盡力而為,3:空閒

-n, –classdata 調度類數據 0-7 用於實時和盡力而為的類

如何設置-c-n選擇ionice流程?

由於所有子程序仍然是會話 ID 的一部分(sessps輸出中),我們可以使用以下命令利用該事實:

$ parent=6187
$ ps -eo sess:1=,pid:1= |sed -n "s/^$parent //p"

這應該返回給我們從lb load. 我們也可以直接從 獲取這個pgrep,也可以使用-s開關。

$ pgrep -s $parent

然後我們可以renice像這樣:

$ renice $(pgrep -s $parent)

例子

這是一個人為的例子,希望能說明這一切是如何工作的。我們從一個shell開始,“PID=10515”。

1.確認會話ID

$ ps -j
 PID  PGID   SID TTY          TIME CMD
10515 10515 10515 pts/8    00:00:00 bash
30781 30781 10515 pts/8    00:00:00 ps

2. 假工作 然後我們開始做一些我們忘記做的假工作renice

$ sleep 10000 &
$ sleep 10000 &

我們確認它們在我們 shell 的會話 ID ( SID) 下。

$ ps -j
 PID  PGID   SID TTY          TIME CMD
10515 10515 10515 pts/8    00:00:00 bash
31107 31107 10515 pts/8    00:00:00 sleep
31111 31111 10515 pts/8    00:00:00 sleep
31140 31140 10515 pts/8    00:00:00 ps

3. 獲取與 SID 關聯的 PID 我們可以得到一個所有程序的列表,它SID是 10515。

$ pgrep -s 10515
10515
31107
31111

4.確認目前nice 現在大家nice的水平是多少?使用此命令檢查:

$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515
10515 10515 0
10515 31107 0
10515 31111 0
10515 31354 0
10515 31355 0

5.更改所有SID後代的nice 好的,所以每個人nice都是 0,讓我們改變它。

$ renice $(pgrep -s 10515)
31107 (process ID) old priority 0, new priority 19
31111 (process ID) old priority 0, new priority 19

6. 確認 檢查我們的工作:

$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515
10515 10515 0
10515 31107 19
10515 31111 19
10515 31426 0
10515 31427 0

PID 31107 和 31111 是我們的睡眠程序,我們只是將它們的 nice 批量更改為 19,並僅提供有關SID它們關聯的資訊。

7. 仔細檢查 ps如果你真的很偏執,你也可以檢查輸出:

$ ps -eaf | grep -E "31107|31111"
saml     31107 10515  0 22:30 pts/8    00:00:00 sleep 10000
saml     31111 10515  0 22:30 pts/8    00:00:00 sleep 10000
saml     31531 10515  0 22:35 pts/8    00:00:00 grep --color=auto -E 31107|31111

參考

ionice

如果您試圖控制程序的 I/O 優先級以及它們的 nice 級別,您應該能夠將上面的命令範例更改為如下所示:

$ renice -n 19 $(pgrep -s $parent)
$ ionice -c 3 -p $(pgrep -s $parent)

如果您查看手冊頁,ionice則無法-c 3-n.

  -c, --class class
         Specify the name or number of the scheduling class to use; 0 for
        none, 1 for realtime, 2 for best-effort, 3 for idle.

  -n, --classdata level
         Specify  the  scheduling class data.  This only has an effect if 
         the class accepts an argument.  For realtime and best-effort, 0-7 
         are valid data (priority levels).

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