プロセスを操るコマンドを淡々と紹介します。
学習用、LPIC、LinuC対策などでご利用ください。
また、プロセスチーズのことだと思った人はブラウザバックを強く推奨します。
コマンド一覧
Linuxで動いているプログラムのことをプロセスという。
そんなプロセスを扱う以下のコマンドについて利用例と共に紹介する。(カッコで囲んでいるのはおまけ)
コマンド | 説明 |
---|---|
pgrep | ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索する |
top | 実行中のプロセスをリアルタイムで表示する |
ps | プロセスの情報を取得する |
pstree | 現在動作しているプロセスをツリー形式で表示する |
nice | プロセスの優先度を変更する |
renice | 動作中のプロセスの優先度を変更する |
jobs | 実行中のプロセスを表示する |
bg | バックグラウンドジョブにする |
fg | フォアグラウンドジョブにする |
kill | プロセスにシグナル信号を送る |
killall | プロセスにシグナル信号を送る |
(free) | システムの空きメモリと利用メモリの量を表示する |
pgrep
ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索するコマンド
$ pgrep -u root
1
2
3
4
6
...(省略)
$ pgrep -U 0
1
2
3
4
6
...(省略)
-uでユーザー名、-UでUIDを指定することができる
LINUXではrootのUIDは0
top
実行中のプロセスをリアルタイムで表示するコマンド
top - 22:06:29 up 1 day, 16:36, 1 user, load average: 0.00, 0.02, 0.00
Tasks: 96 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1002108 total, 150664 free, 517700 used, 333744 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 330584 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17870 mysql 20 0 1309152 319372 0 S 0.7 31.9 6:43.18 mysqld
32132 ubuntu 20 0 44524 3928 3320 R 0.3 0.4 0:00.01 top
1 root 20 0 159948 6360 3880 S 0.0 0.6 0:04.36 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
psをオプションなしで実行すると、現在のシェルから起動したプロセスだけを表示する
自分の環境では遊びで立てていた mysqld や、今実行している top コマンドのプロセスも見ることができる
画面は自動で更新され、CPU使用率の高い順に表示されている
モニタリングは「q」を押すと終了する
「PID」はプロセスID、「USER」はプロセスを実行したユーザー、「%CPU」はCPUを消費している割合、「%MEM」はメモリを消費している割合を意味している。
ps
PS(ProceSs)コマンドはプロセスの情報を取得するコマンド
$ ps
PID TTY TIME CMD
31249 pts/0 00:00:00 bash
31348 pts/0 00:00:00 ps
オプションなしの実行をすると、その端末で起動したプロセスの一覧が表示される。
「PID」はプロセスID、「TTY」はプロセスを実行した端末名、「TIME」はプロセスの実行時間、「CMD」は実行コマンドを意味している。
結果より、シェルはbashを利用していることがわかる。
オプション | 説明 |
---|---|
a | 他のユーザーのプロセスも表示する |
u | ユーザー名も表示する |
x | 端末から実行された物ではないプロセスも表示する |
e | カーネル・プロセス以外のすべてのプロセスに関する情報を表示する |
f | 完全なリストを生成する |
o | 表示するカラムをカスタムする |
アクティブなプロセスを表示する
ps aux
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 159948 6268 ? Ss Aug27 0:04 /sbin/init
root 2 0.0 0.0 0 0 ? S Aug27 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Aug27 0:00 [rcu_gp]
...省略...
ubuntu 31248 0.0 0.3 107980 3628 ? S 14:17 0:00 sshd: ubuntu@pts/0
ubuntu 31249 0.0 0.5 23112 5064 pts/0 Ss 14:17 0:00 -bash
ubuntu 31351 0.0 0.3 40088 3504 pts/0 R+ 14:22 0:00 ps aux
ps -ef
という方法もある
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug27 ? 00:00:04 /sbin/init
root 2 0 0 Aug27 ? 00:00:00 [kthreadd]
root 3 2 0 Aug27 ? 00:00:00 [rcu_gp]
...省略...
ubuntu 31248 31155 0 14:17 ? 00:00:00 sshd: ubuntu@pts/0
ubuntu 31249 31248 0 14:17 pts/0 00:00:00 -bash
ubuntu 31355 31249 0 14:27 pts/0 00:00:00 ps -ef
表示を好きにカスタムしちゃうのもいいね
$ ps -o pid,nice,user,cmd
PID NI USER CMD
3614 0 ubuntu -bash
4341 0 ubuntu ps -o pid,nice,user,cmd
pstree
現在動作しているプロセスをツリー形式で表示するコマンド
以下はAWSのEC2で実行している例
$ pstree
systemd─┬─accounts-daemon───2*[{accounts-daemon}]
├─acpid
├─2*[agetty]
├─amazon-ssm-agen───8*[{amazon-ssm-agen}]
├─atd
├─containerd───8*[{containerd}]
├─cron
├─dbus-daemon
├─dockerd───9*[{dockerd}]
├─lvmetad
├─lxcfs───10*[{lxcfs}]
├─mysqld───38*[{mysqld}]
├─networkd-dispat───{networkd-dispat}
├─polkitd───2*[{polkitd}]
├─rsyslogd───3*[{rsyslogd}]
├─snapd───8*[{snapd}]
├─sshd───sshd───sshd───bash───pstree
├─systemd───(sd-pam)
├─systemd-journal
├─systemd-logind
├─systemd-network
├─systemd-resolve
├─systemd-timesyn───{systemd-timesyn}
├─systemd-udevd
└─unattended-upgr───{unattended-upgr}
EC2にアクセスするために必要なsshdからbashが起動し、そのbashからpstreeが実行されているのがわかる
nice
プロセスの優先度を変更する
プロセスの優先度は、-20から19までで-20で定義されていて、低いほど優先度が高い
引数なしで実行すると、優先度は10足される
$ sleep 15 &
[2] 2644
[1] Done nice sleep 15
$ ps -o pid,nice,user,cmd
PID NI USER CMD
2521 0 ubuntu -bash
2644 0 ubuntu sleep 15
2645 0 ubuntu ps -o pid,nice,user,cmd
$ nice sleep 15 &
[1] 2634
$ ps -o pid,nice,user,cmd
PID NI USER CMD
2521 0 ubuntu -bash
2634 10 ubuntu sleep 15
2635 0 ubuntu ps -o pid,nice,user,cmd
renice
実行中のプロセスの優先度を変更する
$ sleep 15 &
[1] 2651
$ ps -o pid,nice,user,cmd
PID NI USER CMD
2521 0 ubuntu -bash
2651 0 ubuntu sleep 15
2652 0 ubuntu ps -o pid,nice,user,cmd
$ renice 10 2651
2651 (process ID) old priority 0, new priority 10
$ ps -o pid,nice,user,cmd
PID NI USER CMD
2521 0 ubuntu -bash
2651 10 ubuntu sleep 15
2655 0 ubuntu ps -o pid,nice,user,cmd
jobs
(バックグラウンド)実行中のジョブを表示する。
ジョブはユーザーから見た処理の単位のことで、ユーザーに見える形のフォアグラウンドジョブと見えない形のバックグラウンドジョブがある。
bgコマンドを前につけるか、実行コマンドの後ろに「&」をつけることで、バックグラウンドジョブにすることができる。
$ sleep 60 &
[1] 3810
$ jobs
[1]+ Running sleep 60 &
$ kill -s SIGKILL %1
$ jobs
[1]+ Killed sleep 60
[1]
や %1
はジョブIDと呼ばれ、ユーザーごとに割り当てられる。
bg
バックグラウンドジョブにする
実行中のプログラムでCtrl + z
を入力するか、
&
をつけて実行してもバックグラウンドジョブになる。
fg
フォアグラウンドジョブにする
bashではフォアグラウンドジョブで動けるのは一つのプログラムだけである
kill
killコマンドを用いるとプロセスにシグナルという信号を送ることができる
|シグナルID|シグナル名|動作|
|---|---|---|---|
|1|SIGUP|端末の切断による終了|
|2|SIGINT|割り込みによる終了|
|9|SIGKILL|強制終了|
|15|SIGTERM|終了(デフォルト)|
|18|SIGCONT|再開|
SIGTERMだとプログラムの終了処理が実行されるが、SIGKILLはそのまま強制終了される
ちなみに、「Control + c」で終了する時はSIGINTが送信されている
プロセスを終了する
プロセスIDが32147のプロセスを終了させたい時は以下のようにする
$ kill -15 32147
シグナルIDを指定して終了することもできる
$ kill -s SIGTERM 32147
プロセスを強制終了する
シグナルIDを指定して
$ kill -9 32147
シグナル名を指定して
$ kill -s SIGKILL 32147
※ SIGKILLなどは単にKILLとしてもコマンドは有効
killall
プロセス名を指定してプロセスにシグナル信号を送る
同じプログラムを複数実行してもプロセスごとに異なるPIDが割り当てられることになっているが、killallを用いると同じ名前のプロセスをまとめて終了できる
$ vi a.txt &
[1] 3728
$ ps
PID TTY TIME CMD
3614 pts/0 00:00:00 bash
3728 pts/0 00:00:00 vi
3732 pts/0 00:00:00 ps
$ killall -15 vi
$ ps
PID TTY TIME CMD
3614 pts/0 00:00:00 bash
3728 pts/0 00:00:00 vi
3734 pts/0 00:00:00 ps
$ killall -SIGKILL vi
[1]+ Killed vi a.txt
$ ps
PID TTY TIME CMD
3614 pts/0 00:00:00 bash
3736 pts/0 00:00:00 ps
free
システムの空きメモリと利用メモリの量を表示する
-t オプションと合わせると、物理メモリ、スワップメモリの合計を示す行も表示してくれる
$ free -t
total used free shared buff/cache available
Mem: 1002108 516296 104900 812 380912 331188
Swap: 0 0 0
Total: 1002108 516296 104900
まとめ
プロセスに凝るだけで(少なくとも用語くらいは)カーネルのプログラムを知ることができます。
どのようなプログラムがパソコンで動いているか意識しながら楽しいLinux生活を送りましょう。
一年ぶりのプロセスに関する話題でした。こっちもよろしくね。