Linuxのプロセス管理コマンドを触って学習する〜その②〜

LPIC101が思ってたより知らないことが多いので、実際触りながら記録していくことにした。

#テスト用シェルの実行
[前回](https://qiita.com/r_saiki/items/2ccefecfe5a8d1a199ac)のシェルだとバックグラウンド時も出力されて、かわりづらいので以下のように変更
##ソース

~~~bash:Process1.shとProcess2.sh
#!/bin/bash

while true;do
  sleep 60
done
~~~

##バックグラウンドで実行
末尾に＆を付けるとバックグラウンドで実行される。

~~~
$ ./Process1.sh &
$ ./Process2.sh &
$ jobs
[1]-  実行中               ./Process1.sh &
[2]+  実行中               ./Process2.sh &
~~~

#プロセスの優先度変更
現在のシェルのプロセスの詳細を表示

~~~
$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 16108 16103  20   0  22780  5328 wait   Ss   pts/3      0:00 bash
0  1000 25234 16108  20   0  12268  2896 wait   S    pts/3      0:00 /bin/bash ./Process1.sh
0  1000 25606 16108  20   0  12268  2936 wait   S    pts/3      0:00 /bin/bash ./Process2.sh
0  1000 28338 25234  20   0   7016   696 hrtime S    pts/3      0:00 sleep 60
0  1000 28421 25606  20   0   7016   660 hrtime S    pts/3      0:00 sleep 60
4  1000 28423 16108  20   0  28648  1440 -      R+   pts/3      0:00 ps l
~~~

NIがnice値(優先度)を表している。nice値(優先度)は-20〜19の数値で、-20がもっとも優先度が高く 19がもっとも低い優先度になる。デフォルトのnice値は0となる。
./Process1.shのnice値を10に変更する。NIフィールドが10になる。

~~~
$ renice 10 -p 25234
25234 (process ID) old priority 0, new priority 10
$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 16108 16103  20   0  22780  5328 wait   Ss   pts/3      0:00 bash
0  1000 25234 16108  30  10  12272  2900 wait   SN   pts/3      0:00 /bin/bash ./Process1.sh
0  1000 25606 16108  20   0  12272  2940 wait   S    pts/3      0:00 /bin/bash ./Process2.sh
0  1000 29071 25234  30  10   7016   696 hrtime SN   pts/3      0:00 sleep 60
0  1000 29083 25606  20   0   7016   664 hrtime S    pts/3      0:00 sleep 60
4  1000 29084 16108  20   0  28648  1428 -      R+   pts/3      0:00 ps l
~~~

topコマンドにoオプションで列名NIを指定して、nice値(優先度)順に表示すると、Process1.shとProcess1.shで呼び出しているsleepコマンドが表示される。

~~~
$ top -o NI

top - 15:14:54 up 2 days,  5:01,  1 user,  load average: 0.76, 0.75, 0.53
Tasks: 241 total,   2 running, 239 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.9 us,  1.8 sy,  0.0 ni, 88.2 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3840508 total,   360368 free,  1963676 used,  1516464 buff/cache
KiB Swap:  3986428 total,  2700060 free,  1286368 used.  1236736 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                    
   32 root      39  19       0      0      0 S   0.0  0.0   0:02.96 khugepaged                                                                 
 3714 user   39  19   27636   1460   1408 S   0.0  0.0   0:00.00 fcitx-dbus-watc                                                            
 4283 user   30  10  794176  82660  62828 S   0.0  2.2   0:21.83 update-manager                                                             
25234 user   30  10   12272   2900   2676 S   0.0  0.1   0:00.06 Process1.sh                                                                
29905 user   30  10    7016    680    612 S   0.0  0.0   0:00.00 sleep                                                                      
   31 root      25   5       0      0      0 S   0.0  0.0   0:00.00 ksmd 
~~~

#プロセスの終了
killコマンドにジョブIDを指定してプロセスを終了する。

~~~
$ jobs
[1]-  実行中               ./Process1.sh &
[2]+  実行中               ./Process2.sh &
$ kill %1
$ jobs
[1]-  Terminated              ./Process1.sh
[2]+  実行中               ./Process2.sh &
~~~

killコマンドではプロセス名を指定できないので、killallコマンドを使う。

~~~
$ jobs
[2]+  実行中               ./Process2.sh &
$ kill Process2.sh
bash: kill: Process2.sh: 引数はプロセスIDかジョブIDでなければいけません
$ killall Process2.sh
[2]+  Terminated              ./Process2.sh
$ jobs
$
~~~

killコマンドは、プロセスにシグナルを送って終了処理をさせるみたい。何も指定しない場合のデフォルトは、SIGTERM。
そこまでは普段使わないので、とりあえずこんなとこで終了。