プロセスを操るコマンド達  〜  プロセスの状態確認、優先度、バックグラウンド実行など

プロセスを操るコマンドを淡々と紹介します。

学習用、LPIC、LinuC対策などでご利用ください。

また、プロセスチーズのことだと思った人はブラウザバックを強く推奨します。

# コマンド一覧

Linuxで動いているプログラムのことをプロセスという。

そんなプロセスを扱う以下のコマンドについて利用例と共に紹介する。（カッコで囲んでいるのはおまけ）

|コマンド|説明|
|---|---|
|[pgrep](#pgrep)|ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索する|
|[top](#top)|実行中のプロセスをリアルタイムで表示する|
|[ps](#ps)|プロセスの情報を取得する|
|[pstree](#pstree)|現在動作しているプロセスをツリー形式で表示する|
|[nice](#nice)|プロセスの優先度を変更する|
|[renice](#renice)|動作中のプロセスの優先度を変更する|
|[jobs](#jobs)|実行中のプロセスを表示する|
|[bg](#bg)|バックグラウンドジョブにする|
|[fg](#fg)|フォアグラウンドジョブにする|
|[kill](#kill)|プロセスにシグナル信号を送る|
|[killall](#killall)|プロセスにシグナル信号を送る|
|[(free)](#free)|システムの空きメモリと利用メモリの量を表示する|



# pgrep

ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索するコマンド

```bash
$ pgrep -u root
1
2
3
4
6
...(省略)
$ pgrep -U 0
1
2
3
4
6
...(省略)
```

-uでユーザー名、-UでUIDを指定することができる

LINUXではrootのUIDは0

# top

実行中のプロセスをリアルタイムで表示するコマンド

```bash
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)コマンドはプロセスの情報を取得するコマンド

```bash
$ 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```

```bash
$ 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```という方法もある

```bash
$ 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で実行している例

```bash
$ 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足される

```bash
$ 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コマンドを前につけるか、実行コマンドの後ろに「&」をつけることで、バックグラウンドジョブにすることができる。

```bash
$ 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のプロセスを終了させたい時は以下のようにする

```bash
$ kill -15 32147
```

シグナルIDを指定して終了することもできる

```bash
$ kill -s SIGTERM 32147
```

### プロセスを強制終了する

シグナルIDを指定して

```bash
$ kill -9 32147
```
シグナル名を指定して

```bash
$ kill -s SIGKILL 32147
```

※ SIGKILLなどは単にKILLとしてもコマンドは有効

# killall

プロセス名を指定してプロセスにシグナル信号を送る

同じプログラムを複数実行してもプロセスごとに異なるPIDが割り当てられることになっているが、killallを用いると同じ名前のプロセスをまとめて終了できる

```bash
$ 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 オプションと合わせると、物理メモリ、スワップメモリの合計を示す行も表示してくれる

```bash
$ 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生活を送りましょう。

一年ぶりのプロセスに関する話題でした。こっちもよろしくね。

[プロセスの終了の仕方 ～ top & kill](https://qiita.com/okmt1230z/items/121e1d31ac180c639961)