Linux共通

【Linux初心者向け】プロセスに対する管理方法について

今回はプロセスに関して紹介してい行きたいと思います。

Linuxを扱う上で、自然とコマンドを使用し、その結果が帰ってきますが、

実行したコマンドが意図しない動作担った際に、プロセスがどうなったか調べる際にプロセス監視に関するコマンドが役立ちます。

これから紹介していくコマンドはプロセスについて役立つコマンドなので、ぜひ覚えていってください。

プロセスの監視について

プロセスとは、実行中のプログラムの事です。システムでは、常に複数のプロセスが動作しています。

ユーザがコマンドを、システムが自動でプログラムを実行することによって、プロセスは生成され、プログラムの終了と伴に消滅します。

実行中ののプロセスを表示する主なコマンドは下記となります。

コマンド 説明
ps プロセスの情報を表示する
pstree プロセスを階層構造で表示する
top プロセスやリソース情報をリアルタイムに表示する

それぞれの動作についてはそれぞれ紹介していきます。

 

psコマンド

psコマンドは実行中のプロセスの情報を表示するコマンドです。

オプションも豊富でプロセスに関して調べる際によく使われます。

現在のシェルから起動したプロセスだけを表示するには、引数を指定せずにpsコマンドを実行します。

オプションを使用することによりその端末で起動されているすべてのプロセスを表示したりできます。

 

ps:書式

ps [オプション]

 

psコマンド:オプション

psコマンドで使用できる主なオプションの種類は2種類あります。

種類 オプション 説明
UNIX -e、-A すべてのプロセスを表示する
-f 詳細情報を表示する
-l 長いフォーマットで詳細情報表示する
-o ユーザ定義のフォーマットで表示する
BSD a 制御端末を持つすべてのプロセスを表示する
u 詳細情報を表示する
x 制御端末のないプロセス情報も表示する

それではpsコマンドについて実行してみます。

mitsublog@mitsublog:~$ ps
PID TTY TIME CMD
28023 pts/1 00:00:00 bash
29368 pts/1 00:00:00 ps
mitsublog@mitsublog:~$

psコマンドによりプロセスIDである「28023」であるbashと「29368」であるpsコマンドがプロセスとして実行されていることが表示されています。

表示項目の説明は下記となります。

表示項目 説明
PID プロセスID
TTY 制御している端末
TIME 実行時間
CMD コマンド(実行ファイル名)

 

プロセスツリーのプロセスの表示

「pstree」コマンドは、プロセスの親子関係を「ツリー構造」で表示します。

プロセスからプロセスが生み出される場合、どれが親プロセス(カレントプロセスの親プロセス)でどれが子プロセスなのか分かりづらい場合があります。

pstreeコマンドはそういった関係のプロセスをツリー構造で表示してくれますので、とても見やすくなります。

ただデフォルトのインストールされていない場合もあるので、その際に個別にインストールする必要があります。

pstree:書式

pstree [オプション]

pstree:オプション

bオプション 説明
-h カレントプロセスとその先祖のプロセスを強調表示する
-p PIDを表示する

それでは実行してみます。pstreeを実行することによりプロセスの関係を階層構造で表示してくれます。

root@mitsublog:/home/mitsublog# pstree
systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}]

 

topコマンド

topコマンドは、稼働中のシステムをリアルタイムかつ簡潔に監視することができるコマンドです。cpuやメモリの利用率など表示しております。

top:書式

top [オプション]

top:オプション

オプション 説明
-d 秒数 更新の感覚を秒単位で指定
-n 数値 表示の回数を数値で指定

topコマンドは実行中のプロセスやリソース情報含め表示してくれますので、まとめて様々な情報を見たい場合に利用します。

topコマンド一部抜粋

root@mitsublog:/home/mitsublog# top

top - 16:51:33 up 19 min, 2 users, load average: 1.90, 2.18, 1.26
Tasks: 177 total, 2 running, 175 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.4 si, 0.0 st
MiB Mem : 4973.3 total, 3303.6 free, 678.7 used, 991.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4059.7 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13 root 20 0 0 0 0 S 0.2 0.0 0:00.68 ksoftir+
281 root 20 0 0 0 0 R 0.2 0.0 0:04.07 kworker+
2703 root 20 0 12892 3660 3156 R 0.2 0.1 0:00.11 top

 

「top」コマンドには他にもオプションや実行例について過去に執筆した記事にて紹介しております。

興味がある方は下記記事にてご覧ください。

 

 

プロセスの優先度

プロセスのうち、どれを実行していくのかはプロセスの優先度(priority:プライオリティ)を基に決定されます。

プロセスを同時期に実行してもより優先度が高いプロセスの処理が優先されます。管理者ユーザと一般ユーザの実行するプロセスにも優先度に違いがあります。

「ps -l」コマンド、もしくは「top」コマンドを使用することで、「NI」項目が表示されている優先度にてプロセスの優先度を確認できます。

NIは優先度を「nice値」で表示し、小さな値ほど優先度が高いことを表します。

 

niceコマンド:優先度の変更

プロセスの優先度をデフォルトから変更するには、niceコマンドを使用します。

nice値は「-20-19」がデフォルトが決まっており、「-値」はrootユーザでしか変更できません。マイナスになると優先度が高く、プラスになると優先度は低くなります。

 

niceコマンド:書式

nice [オプション] [コマンド]

niceコマンド:オプション

niceコマンドはオプションで数値を指定しないと、デフォルト(0)+10の優先度を付与します。「-n」オプションを指定すること絵、指定した優先度を設定できます。

なお、優先度にマイナス値を指定可能なのはroot権限を持つユーザのみです。

nice値確認

mitsublog@mitsublog:~$ ps -eo pid,comm,nice,pri
PID COMMAND NI PRI
1 systemd 0 19

下記例ではnice値を「15」で指定し「sleep」コマンドを実行していきます。

nice値による指定

mitsublog@mitsublog:~$ nice -n 15 sleep 10000 &
[4] 2869
mitsublog@mitsublog:~$ ps -eo pid,comm,nice,pri | grep sleep
2869 sleep 15 4
mitsublog@mitsublog:~$

結果nice値で指定した優先度になります

reniceコマンド:実行中の優先度の変更

動作中のプロセスの優先度を変更するにはreniceコマンドを使用します。

renice:書式

renice [オプション] 優先度

renice:オプション

オプション 説明
-n 優先度 指定した優先度に変更する
-p PID 変更対象のPIDを指定する

優先度「15」を「17」に変更します。

mitsublog@mitsublog:~$ ps -eo pid,comm,nice,pri | grep sleep
2869 sleep 15 4
mitsublog@mitsublog:~$ renice -n 17 -p 2869
2869 (process ID) 従来の優先順位は 15 で, 新しい優先順位は 17 です
mitsublog@mitsublog:~$ ps -eo pid,comm,nice,pri | grep sleep
2869 sleep 17 2
mitsublog@mitsublog:~$

 

オプションには、新たに付与したい優先度を数値で指定し、また、変更対象のプロセスを明示するため、「-p」オプションでPIDを指定します。

優先度は「-n」を省略して、数値だけでも指定可能です。reniceコマンドでも、マイナス値の設定にはroot権限が必要です。

 

ジョブについて

ジョブもプロセスと関係がありますが、今回の記事では省略します。過去下記記事にて紹介しておりますので、興味がある方はご覧ください。

 

シグナルによるプロセス制御

シグナルとは、割り込みによってプロセスに特定の動作をするように通知するための仕組みです。

通常、プロセスは処理を終えると自動的に消滅しますが、プロセスに対してシグナルを送信することで、プロセスを終了させることができます。

シグナルはキーボードによる操作や「kill」コマンドの実行により、実行中のプロセスに対してシグナルを送信し、強制終了したりできます。

 

主に使用するシグナルの種類

killコマンドを実行した際に特定のシグナルを指定していない場合はデフォルトであるSIGTERM(シグナル番号15)が送信されます。

シグナル番号 シグナル名 説明
1 SIGHUP 端末の切断によるプロセスの終了
2 SIGINT 割り込みによるプロセスの終了「ctrl + c」
9 SIGKILL プロセスの強制終了
15 SIGTERM プロセスの終了(デフォルト)
18 SIGCONT 一時停止したプロセスを再開する。

 

killコマンド:プロセス停止

プロセスに対して強制的に終了させるには「kill」コマンドを使用します。

killコマンド:書式

kill [オプション] [シグナル名 | シグナル番号] プロセスID

kil [オプション] [シグナル名 | シグナル番号] %ジョブID

kill:オプション

なお「-l」オプションを指定し、かつ特定のプロセスIDやジョブIDを指定しないで実行すると、シグナル名の一覧を表示します。

シグナル名の一覧表示

mitsublog@mitsublog:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
mitsublog@mitsublog:~$

 

killコマンドを使用して、sleepコマンドによって発生した、プロセスID「2683」のプロセスを終了させます。

killコマンドによるsleepプロセスの修了

mitsublog@mitsublog:~$ ps -ef | grep sleep
mitsubl+ 2683 1687 0 19:16 pts/0 00:00:00 sleep 100000
mitsubl+ 2687 1687 0 19:16 pts/0 00:00:00 grep --color=auto sleep
mitsublog@mitsublog:~$ kill 2683
[1]+ Terminated sleep 100000
mitsublog@mitsublog:~$ ps -ef | grep sleep
mitsubl+ 2703 1687 0 19:17 pts/0 00:00:00 grep --color=auto sleep
mitsublog@mitsublog:~$

 

強制終了の注意点

デフォルトのシグナルであるSIGTERM(15)は、プログラムを終了する前に、アプリケーションごとに必要なクリーンアップ(終了処理)の処理を行ってから、自分自身でプロセスを終了します。クリーンアップでは、使っていたリソースの解放やロックファイルの削除等を行います。

しかし、SIGTERM(15)でプロセスにSIGKILL(9)が送られると、そのシグナルを受け取ることなく、カーネルによって強制的に終了します。したがって、クリーンアップは行われません。

プロセスが生み出したファイルやプロセスを強制終了させたことにより、削除処理が行われず不要に残り、リソースを圧迫したり、予期しない動作を引き起こす可能性があるので、使用するには注意が必要です。

 

killallコマンド:複数プロセスをまとめて終了

プロセス名を指定してシグナルを送信する際には、killallコマンドを使用可能です。同じプログラムを複数実行してもプロセスごとに異なるPIDが割り当てられます。したがって、killallコマンドは同じ滑のプロセスが複数存在し、それらをまとめて終了したい場合に有効です。

killall:書式

killall [オプション] プロセス名

 

killall:オプション

オプション 説明
-l,--list シグナル名のリストを表示する
-i,--interactive シグナルを送る前に確認する
-v,--verbose シグナルの送信に成功したらメッセージを表示する
-u,--user ユーザ 指定したユーザーのプロセスにだけシグナルを送る

 

下記例では「killall」コマンドを利用し、プロセス名「sleep」のプロセスをすべて終了させます。

mitsublog@mitsublog:~$ sleep 1000000 &
[1] 2714
mitsublog@mitsublog:~$ sleep 1000000 &
[2] 2715
mitsublog@mitsublog:~$ sleep 1000000 &
[3] 2717
mitsublog@mitsublog:~$ sleep 1000000 &
[4] 2718
mitsublog@mitsublog:~$ ps -ef | grep sleep
mitsubl+ 2714 1687 0 19:24 pts/0 00:00:00 sleep 1000000
mitsubl+ 2715 1687 0 19:24 pts/0 00:00:00 sleep 1000000
mitsubl+ 2717 1687 0 19:24 pts/0 00:00:00 sleep 1000000
mitsubl+ 2718 1687 0 19:24 pts/0 00:00:00 sleep 1000000
mitsubl+ 2721 1687 0 19:24 pts/0 00:00:00 grep --color=auto sleep
mitsublog@mitsublog:~$ killall sleep
[1] Terminated sleep 1000000
[2] Terminated sleep 1000000
[3]- Terminated sleep 1000000
[4]+ Terminated sleep 1000000
mitsublog@mitsublog:~$ ps -ef | grep sleep
mitsubl+ 2724 1687 0 19:25 pts/0 00:00:00 grep --color=auto sleep
mitsublog@mitsublog:~$

このようにプロセス名「sleep」プロセスをすべて終了させました。

 

pkillコマンド:killall同等の処理を行う

「pkill」コマンドはkillall同様プロセス名からプロセスをすべて終了させます。

mitsublog@mitsublog:~$ sleep 1000000 &
[1] 2796
mitsublog@mitsublog:~$ sleep 1000000 &
[2] 2797
mitsublog@mitsublog:~$ sleep 1000000 &
[3] 2798
mitsublog@mitsublog:~$ sleep 1000000 &
[4] 2799
mitsublog@mitsublog:~$ pkill sleep
[1] Terminated sleep 1000000
[2] Terminated sleep 1000000
[3]- Terminated sleep 1000000
[4]+ Terminated sleep 1000000
mitsublog@mitsublog:~$

pgrep:プロセス名から現在実行中のプロセスを検索

プロセス名から現在実行中のプロセスのみ検索することができます。検索結果では、プロセスIDの表示をしております。「-l プロセス名」を使用することでプロセス名も表示されます。

mitsublog@mitsublog:~$ sleep 1000000 &
[1] 2802
mitsublog@mitsublog:~$ sleep 1000000 &
[2] 2803
mitsublog@mitsublog:~$ sleep 1000000 &
[3] 2804
mitsublog@mitsublog:~$ sleep 1000000 &
[4] 2805
mitsublog@mitsublog:~$ pgrep sleep
2802
2803
2804
2805
mitsublog@mitsublog:~$

 

 

実行例:活用例

topコマンドを利用した:実行中のプロセスの優先度の変更

topコマンドを使うことで、実行中のプロセスの優先度を変更することができます。topコマンドによる優先度の変更手順は以下の通りです。

①topコマンドを実行、その後「r」を選択。

root@mitsublog:/home/mitsublog# top

top - 19:35:28 up 20 min, 2 users, load average: 0.23, 0.89, 0.84
Tasks: 175 total, 1 running, 174 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.8 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 4973.3 total, 2893.6 free, 933.0 used, 1146.7 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3792.9 avail Mem
PID to renice [default pid = 962] 4089

②その後画面に「PID to renice」が表示されるため、変更したいプロセスのPIDを入力し「Enter」キーを押します。今回は「4089」のプロセスIDを指定します。

root@mitsublog:/home/mitsublog# top

top - 19:35:28 up 20 min, 2 users, load average: 0.23, 0.89, 0.84
Tasks: 175 total, 1 running, 174 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.8 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 4973.3 total, 2893.6 free, 933.0 used, 1146.7 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3792.9 avail Mem
Renice PID 4089 to value 1

③画面に「Renice PID[指定したPID] to value」が表示されるため、優先度を入力し「Enter」キーを押す。そうすることで「4089」プロセスIDをもつプロセスの優先度を1にできます。

 

プロセスをすべて表示する

起動しているすべてのプロセスを表示するには「aux」を付与します。下記例ではプロセス数が多いため一部省略しています。

root@mitsublog:/home/mitsublog# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 167952 11344 ? Ss 19:14 0:01 /sbin/init sp
root 2 0.0 0.0 0 0 ? S 19:14 0:00 [kthreadd]

pstree -p:プロセスを階層構造で表示

下記例では「systemd(1)」プロセスから「ModemManager(539)」プロセスを生み出し可動している状態が確認できます。

root@mitsublog:/home/mitsublog# pstree -p
systemd(1)─┬─ModemManager(539)─┬─{ModemManager}(555)

このようにPID(プロセスID)とプロセスの親子関係が表示されみやすくなります。

nice:nice値を指定した値でプロセス実行

nice値を「10」で設定して「sleep」コマンドを実行していきたいと思います。

root@mitsublog:/home/mitsublog# nice -n 10 sleep 10000 &
[1] 4806
root@mitsublog:/home/mitsublog# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 4509 4096 0 80 0 - 3309 do_sys pts/0 00:00:00 sudo
4 S 0 4510 4509 0 80 0 - 3019 do_wai pts/0 00:00:00 su
4 S 0 4511 4510 0 80 0 - 2911 do_wai pts/0 00:00:00 bash
0 S 0 4806 4511 0 90 10 - 2280 hrtime pts/0 00:00:00 sleep
4 R 0 4808 4511 0 80 0 - 3113 - pts/0 00:00:00 ps
root@mitsublog:/home/mitsublog#

renice:実行中のプロセスのnice値を変更

プロセスID「4806」である「sleep」プロセスのnice値を「10」から「15」に変更したい場合はreniceコマンドを使用します。

root@mitsublog:/home/mitsublog# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 4509 4096 0 80 0 - 3309 do_sys pts/0 00:00:00 sudo
4 S 0 4510 4509 0 80 0 - 3019 do_wai pts/0 00:00:00 su
4 S 0 4511 4510 0 80 0 - 2911 do_wai pts/0 00:00:00 bash
0 S 0 4806 4511 0 90 10 - 2280 hrtime pts/0 00:00:00 sleep
4 R 0 4811 4511 0 80 0 - 3113 - pts/0 00:00:00 ps
root@mitsublog:/home/mitsublog# renice -n 15 4806
4806 (process ID) 従来の優先順位は 10 で, 新しい優先順位は 15 です
root@mitsublog:/home/mitsublog# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 4509 4096 0 80 0 - 3309 do_sys pts/0 00:00:00 sudo
4 S 0 4510 4509 0 80 0 - 3019 do_wai pts/0 00:00:00 su
4 S 0 4511 4510 0 80 0 - 2911 do_wai pts/0 00:00:00 bash
0 S 0 4806 4511 0 95 15 - 2280 hrtime pts/0 00:00:00 sleep
4 R 0 4813 4511 0 80 0 - 3113 - pts/0 00:00:00 ps
root@mitsublog:/home/mitsublog#

kill -9:強制終了

「sleep」プロセスを「ps」コマンドで確認したところ、稼働中ですので、「kill -9」で強制終了させます。

root@mitsublog:/home/mitsublog# ps
PID TTY TIME CMD
4509 pts/0 00:00:00 sudo
4510 pts/0 00:00:00 su
4511 pts/0 00:00:00 bash
4783 pts/0 00:00:00 sleep
4796 pts/0 00:00:00 ps
root@mitsublog:/home/mitsublog# kill -9 4783
[1]+ 強制終了 sleep 100000
root@mitsublog:/home/mitsublog# ps
PID TTY TIME CMD
4509 pts/0 00:00:00 sudo
4510 pts/0 00:00:00 su
4511 pts/0 00:00:00 bash
4798 pts/0 00:00:00 ps
root@mitsublog:/home/mitsublog#

psコマンドで再度確認したところ強制終了させることができました。

 

まとめ

今回の記事は以上となります。それではまとめに入ります。

まとめ

・プロセスを確認するの主に利用するのは「ps」コマンドで、リソース情報等もまとめて見たい場合は「top」コマンドを使用します。

・プロセスを終了したい場合はkillコマンドを主に使用します。強制終了する際に注意が必要です。

・プロセスの中でも優先して処理をしたい場合は「nice」コマンドで優先度を上げて処理します。

 

以上となります。Linuxを扱う上でプロセスに関する知識は必須となっておりますので、ぜひ覚えて言ってください。

当ブログでは主にLinuxに関する情報を執筆しておりますので、興味がある方はぜひご覧ください。

 

  • この記事を書いた人
  • 最新記事

ミツ

サーバ初心者向け「server-beginner」を運営する「ミツ」と申します。 Linux系やwindows系などのサーバに関する部分をメインで執筆していきますので、興味ある方はぜひご覧いただけますと幸いです。 <経歴> 専門学校卒業後、ネットワーク、インフラ、プログラミングを一通り経験。 当メディアでは主にLinux分野に関する内容を発信していきます。

-Linux共通