【修正中！】【Bash】プロセスとジョブについて

## 注意！

この記事は誤った情報を含んでいる可能性があるため、裏どり ＆ 修正中です。
近日中に対応するのでいましばらくお待ちください :bow_tone1:


## はじめに

今回は **プロセス** と **ジョブ** について書いていきます。



## プロセス とは

プロセスとは、OS 上で実行されているプログラムのことを指す。

Linux はマルチプロセスであり 、CPU がタスクを切り替えることで複数のプロセスが同時に管理されている。

| 1 | 2 |
|:-|:-|
| ゾンビプロセス | 停止しているが、何らかの理由でメモリを解放していないプロセス。存在する場合は、kill コマンドなどで削除する。|
| デーモン | 長期間実行され続け、外部からのリクエストを契機に処理がされるプロセス。名前は d で終わることが多い（ sshd、named、httpd 等 ） |




## ジョブ とは

プロセスは OS から見たプログラムの単位である一方で、ジョブは起動中のシェルから見たプログラムの単位である。

シェルからプログラムを立ち上げるとジョブ番号が割り当てられる。



## & を用いてコマンドを実行する

コマンドの末尾に `&` をつけて実行することで、そのコマンドをバックグラウンド上で処理させることができる。

```text:例（ プロセス ID : 2023 でプロセスを起動 ）
[ec2-user@localhost ~]$ sleep 10 &
[2] 2023
[ec2-user@localhost ~]$ 
```



## コマンド

### ps コマンド

現在、動作しているプロセスの一覧を表示するコマンド。

引数なしだと、現在利用しているシェルの持っているプロセスが表示される。

```text:例
[ec2-user@localhost ~]$ ps
    PID TTY          TIME CMD
   2468 pts/0    00:00:00 bash
   2492 pts/0    00:00:00 ps
```

**PID**：プロセスID
**TTY**：端末名
**TIME**：プロセスが実行された実行時間
**CMD**：コマンド名

| オプション | 意味 |
|:-|:-|
| -e | 稼働中のプロセスをすべて表示する |
| -f | より詳細な情報を表示する |
| aux | メモリや CPU などの使用状況をプロセスごとに表示する |
| -u ユーザ名 | 指定したユーザの持っているプロセス一覧を表示する |

```text:例
[ec2-user@localhost ~]$ ps -ef | head -2
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 08:49 ?        00:00:00 /usr/lib/systemd/systemd --switched-root --system --deserialize=32
```

**UID**：実行中ユーザ
**PID**：プロセス ID
**PPID**：親プロセス ID
**C**：CPU 使用率
**STIME**：プロセスの立ち上がった時間
**TTY**：立ち上げた端末名（ ? は端末がないもの ）
**TIME**：利用した総 CPU 時間
**CMD**：コマンド名

```text:例
[ec2-user@localhost ~]$ ps aux | head -2
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  1.6 105020 16304 ?        Ss   08:49   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize=32
```

**USER**：実行中ユーザ
**PID**：プロセス ID
**PPID**：親プロセス ID
**%CPU**：CPU 使用率
**%MEM**：メモリ使用率
**VSZ**：仮想メモリサイズ
**RSS**：使用されているメモリ量
**TTY**：立ち上げた端末名（ ? は端末がないもの）
**STAT**：プロセスの状態（ Z だとゾンビプロセス ）
**START**：プロセスが起動した時間
**TIME**：利用した総 CPU 時間
**CMD**：コマンド名


### top コマンド

実行中のプロセスの状態をリアルタイムで表示

```text:top コマンド実行例
top - 10:59:54 up 1 min,  1 user,  load average: 0.24, 0.19, 0.08
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    949.6 total,    604.6 free,    148.6 used,    196.3 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    661.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                             
      1 root      20   0  105024  16308  10040 S   0.0   1.7   0:00.79 systemd      
```

| オプション | 意味 |
|:-|:-|
| -d 間隔 | 表示する間隔を指定 |

| 実行中のコマンド | 意味 |
|:-|:-|
| k | プロセスを kill する |
| q | 終了する |


### kill コマンド

実行中のプロセスを停止・再起動・一時停止する

```text:例
[ec2-user@localhost ~]$ ps -ef | grep sleep
ec2-user    2445    2213  0 11:04 pts/0    00:00:00 sleep 100
ec2-user    2447    2213  0 11:04 pts/0    00:00:00 grep --color=auto sleep
[ec2-user@localhost ~]$ kill 2445
[1]+  Terminated              sleep 100
```
| 実行例 | 実行結果 |
|:-|:-|
| kill -1(-SIGHUP) プロセスID | プロセスの再起動をする |
| kill -2(-SIGINT) プロセスID | プロセスの割り込みをする（ ctrl + c ） |
| kill -9(-SIGKILL) プロセスID | プロセスの強制終了をする |
| kill -15(-SIGTERM) プロセスID | プロセスの終了をする |
| kill -18(-CONT) プロセスID | プロセスを再開する |
| kill -19(-STOP) プロセスID | プロセスの一時停止をする |


### jobs コマンド

現在実行中のジョブ一覧を表示するコマンド

```text:例
[ec2-user@localhost ~]$ jobs
[1]-  Running                 ./test.sh &
[2]+  Stopped                 sleep 100
```


### kill コマンドを利用したジョブの削除

ジョブを削除するには、**%ジョブ番号** を用いる

```text:例
[ec2-user@localhost ~]$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 ./test.sh &
[ec2-user@localhost ~]$ kill %2
[2]+  Terminated              ./test.sh
[ec2-user@localhost ~]$ jobs
[1]+  Running                 sleep 100 &
```


### ctrl + z （ ショートカットキー ）

現在実行中のジョブを停止する

```text:例
[ec2-user@localhost ~]$ sleep 100
^Z
[1]+  Stopped                 sleep 100
[ec2-user@localhost ~]$ jobs
[1]+  Stopped                 sleep 100
```


### fg コマンド

ジョブをフォアグラウンド実行

```text:例
[ec2-user@localhost ~]$ jobs
[1]+  Running                 sleep 100 &
[ec2-user@localhost ~]$ fg %1
sleep 100
```


### bg コマンド

ジョブをバックグラウンド実行

```text:例
[ec2-user@localhost ~]$ jobs
[1]+  Stopped                 sleep 100
[ec2-user@localhost ~]$ bg %1
[1]+ sleep 100 &
[ec2-user@localhost ~]$ jobs
[1]+  Running                 sleep 100 &
```



## おわりに

プロセス、ジョブに関わるコマンドなどについて触れました。
業務でさらっと ps コマンド叩いてプロセス確認できたらかっこいいね。