改めてLinuxコマンドを理解する[プロセスについて]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はLinuxのプロセスについて解説します。プロセスは簡単にいうと、**今動いているプログラム**のことです。

![7c6ec55d-86e0-499d-a4c6-9644bfeee43e_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/621e7720-eb7e-a2b5-c5a4-afca4f1c5501.png)


## `ps`コマンド
プロセスはLinuxでも、Macでも、Windowsでも同じ概念で動いています。
今パソコン上で動いている全てのプログラムは、全てプロセスとしてOSが管理しています。

まずはLinuxにおけるプロセスの確認方法を見ていきましょう。
```Bash:プロセスの一覧を表示
ps
```

このコマンドをubuntuで叩いてみた場合、以下のようなプロセスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/4d054538-e5d5-a761-8299-cf9f660e99ba.png)

`ps`コマンドをオプションをつけずに実行すると、画像のように少ない情報しか表示されません。

#### PID
このPIDはプロセスIDのことで、プロセスごとに一意の識別子として付与されます。
このPIDを指定して、プロセスを終了させたりすることも可能です。

#### TTY
これはターミナル端末の情報ですね。このプロセスが動いているシェルはどれか？を表示してくれています。

:::note info
当たり前ではありますが、Linuxでは複数のシェルが開かれることが多いです。なので、どのプロセスがどの端末で動いているのかを表示するのは当然と言えます。
:::

#### TIME
こちらはCPUの使用時間です。`ps`コマンドも、`bash`コマンドもCPUが瞬時に実行しているので時間なんてかかっていないようですね。

#### CMD
CMDはCOMMANDを省略したもので、コマンド名そのものです。
`grep`コマンドなどを併用して、特定のプロセスのみを表示することも可能です。
```Bash:grepの併用
ps | grep bash
```




## よく使うオプションについて
psコマンドは、よく使うオプションもありますので、こちらでご紹介します。
よく併用して使われるのが`a`、`u`、`x`の三つです。
```Bash:auxの使用
ps aux
```
これを実行すると、同じLinuxのOSで、違う端末のプロセスも表示されます。
今回はtmuxを使いつつ、プロセスの確認をしていきましょう。
```Bash:tmuxを起動
tmux
```

tmuxを利用したことがない方はこちらの記事で学習してみてください。

https://qiita.com/ikemura-ren/items/a384940ea03f3f26e221


tmuxを開いたら、画面を分割して、ペインを二つにしておきましょう。
まずは片方のシェルで、`ps`コマンドと、`ps aux`コマンドを順番に実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/8f926b71-977e-c961-712a-4da560556335.png)

:::note info
tmuxももちろんプロセスに追加されていますね。
:::


`aux`をつけた方は、別のシェルのプロセスも表示されているのですが、それ以外にも様々な情報が表示されています。一つずつ見ていきましょう。

#### USER
**このコマンドを実行したユーザー情報**です。今回は全てrootユーザーが実行していますが、このLinuxにアクセスしているユーザーが複数いる場合は、そのユーザー名も表示されます。

#### &CPU
CPU使用率をパーセンテージ（%）で表示してくれます。数字の高いプロセスが**CPUを多く使っている**、ということになります。

#### %MEM
プロセスが使用している メモリの割合をパーセンテージ（%）で表示しているものです。


#### VSZ
仮想メモリの使用量のことで、そのプロセスがメモリ上にどれだけ領域を確保したかであり、実際に使用している量ではありません。

#### RSS
こちらは実際に使われたメモリの使用量になります。
例えば、プログラムが1GBのメモリ領域を確保しても、実際に100MBしか使わなければ、**VSZは1GBですが、RSS（メモリ使用量）は100MBになる**ということです。

:::note warn
VSZとRSSは無理に理解しようとしなくてOKです。初学者はこういったところをスルーして、必要になったら調べるようにしていきましょう。
:::


#### STAT
これはステータスの略になっています。今現在のプロセスの状態を教えてくれています。
##### プロセスの種類について
プロセスにも種類があるので、まずはここで少し紹介をいたします。
Linuxのプロセスは、実行状態や動作の仕組みによって分類がされていて、以下のようになります。

| **プロセスの種類** | **説明** |
|----------------|----------------------|
| **フォアグラウンドプロセス** | ユーザーが直接実行し、操作を待つ（例: `ls`, `vim`） |
| **バックグラウンドプロセス** | `&`をつけて実行し、シェルから離れる（例: `sleep 100 &`） |
| **デーモンプロセス** | OSのバックグラウンドで動作（例: `systemd`, `sshd`） |
| **ゾンビプロセス** | 仕事が終わったのに、まだ残っているプロセス |
| **孤立プロセス** | 親（実行したプロセス）がいなくなり、OSに預けられたプロセス |

##### STATに表示されるコードの種類
STATには`Ss`や、`R+`などの表記（コード）があります。
その表記についても以下にまとめます。
| **コード** | **意味** | **説明** |
|-----------|---------|---------|
| `R` | **実行中（Running）** | CPU で実行中のプロセス |
| `S` | **スリープ（Sleep）** | 一時的に待機状態（I/O待ちなど） |
| `D` | **割り込み不可スリープ（Uninterruptible Sleep）** | ディスク I/O などでブロック中 |
| `T` | **停止（Stopped）** | `Ctrl+Z` で停止されたプロセス |
| `Z` | **ゾンビ（Zombie）** | 終了済みだが親プロセスが回収していないプロセス |

| **追加コード** | **意味** |
|--------------|---------|
| `+` | **フォアグラウンドプロセス** |
| `<` | **高優先度** |
| `N` | **低優先度** |
| `s` | **セッションリーダー（`bash` など）** |
| `l` | **マルチスレッド（`L` ではなく小文字 `l`）** |

:::note warn
上記の表を全て覚えるのは難しいですが、`R`が実行中、`S`が待機、`T`が停止などについては理解しておきましょう。
:::


#### START
こちらはプロセスがいつ開始されたかを表示してくれています。
- 時刻 (11:30) → 今日起動
- 日付 (Jan08) → 1週間以上前に起動
- YYYY-MM-DD → 1年以上前に起動

#### auxのオプションの意味
オプションについても表にまとめておきます。
| **コマンド**  | **説明** |
|--------------|--------------------------------------|
| `ps`        | 現在のシェル（TTY）で動いているプロセスのみ表示 |
| `ps a`     | 他のユーザーのプロセスも表示（ただし、ログインセッション内） |
| `ps u`     | ユーザー名とプロセス情報を表示 |
| `ps x`     | バックグラウンドプロセスも表示 |
| `ps aux`    | システム全体のすべてのプロセスを表示（他のユーザー含む） |

:::note info
`ps`コマンドは、基本的に`aux`をつけることが多いですので、**脳死でつけるもの**くらいに覚えておいてください。
:::


## プロセスを終了させるコマンド
プロセスを強制的に終了させるコマンドがあります。
それが`kill`コマンドです。この`kill`コマンドを使って、先ほど開いていたtmuxのペインを強制的に終了させようと思います。

基本的なコマンドの使い方は以下になります。
```Bash:killコマンドの使い方
kill <PID>
```
強制終了したい時
```Bash:強制終了オプション
kill -9 <PID>
```
プロセス名で指定
```Bash:pkill
pkill <プロセス名>
```

#### tmuxのペインを強制終了してる
まずはプロセス一覧を確認
```Bash:一覧
root@2be0b453da33:/# ps aux                                                                                           │
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND                                            │
root           1  0.0  0.0   4300   720 pts/0    Ss   11:03   0:00 /bin/bash                                          │
root         219  0.0  0.0   8952  1268 pts/0    S+   11:09   0:00 tmux                                               │
root         221  0.0  0.0   9624  3584 ?        Ss   11:09   0:01 tmux                                               │
root         230  0.0  0.0   4300  1792 pts/2    Ss   11:11   0:00 -bash                                              │
root         255  0.0  0.0   4300  3420 pts/1    Ss+  12:25   0:00 -bash                                              │
root         261 50.0  0.0   7632  3676 pts/2    R+   12:25   0:00 ps aux        
```

これをみる限り、`ps aux`を実行したのが今のシェルなので、`pts/2`が今いるペイン、`pts/1`がもう一つのペインのようです。

```Bash:killしてみる
kill -9 255
```

:::note warn
tmuxは普通に`kill`しても閉じられないので、今回は`-9`のオプションを使用します。
:::

`kill`コマンドを叩く前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/863f330c-a7d3-2f42-d5b4-80528668b1bb.png)

`kill`コマンドを叩いた後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e3fd120b-fc77-57fd-ba2d-a0f06872c916.png)

ペインが消えました。
`ps aux`コマンドを叩いて、本当になくなっているのかも確かめてください。

:::note info
`kill`コマンドは使い方によっては少々危険ですが、明らかにCPUやメモリを消費しているプロセスを終了させるのに便利なコマンドです。
:::


## おわりに
今回はLinuxにおけるプロセスについてご紹介しました。
MacでもWindowsでも、プロセスを終了させることで、余計に動いているものを消すことができますので、消しても大丈夫なプロセスを消して試してみてください。

まとめ記事に戻るにはこちら👇

https://qiita.com/ikemura-ren/items/3e7b6ec1b0cd9b3928d6