【学習】Linuxコマンド　Day10

# おさらい
前回まで学習したことはこちらです。

- 環境構築 
　→https://qiita.com/imagatasaki/items/4c510cacc6f17556c3b9
- コマンドラインの操作方
- 基本的なコマンド① 
　→https://qiita.com/imagatasaki/items/37a7c12bce015d6bdc4a

- 基本的なコマンド②(ファイル操作)
　→https://qiita.com/imagatasaki/items/7abc96b0afea475077a2
　→https://qiita.com/imagatasaki/items/6ccf0e1cd44ebe1d3e9b
- パーミッション
- スーパーユーザー
　→https://qiita.com/imagatasaki/items/39e081d9c10c1448e0c7
- Vim
  →https://qiita.com/imagatasaki/items/f4302837756102d0d430
- リダイレクト
- パイプライン
  →https://qiita.com/imagatasaki/items/cfc37493ad95ee82c48d
- プロセス
- ジョブ
  →https://qiita.com/imagatasaki/items/aceeffcb5d474bd72b65

# 今日学ぶこと
- フォアグラウンド
- バックグラウンド
- プロセス、ジョブの終了
- シグナル

# フォアグラウンド
フォアグラウンドとはユーザーからの入力を受付、対話的に操作できる状態。
普通にコマンドラインを実行するとフォアグラウンドで実行される。

### ジョブをフォアグラウンドにする(fgコマンド)
fgコマンドを使用することで停止中のジョブをフォアグラウンドにすることが可能。
まずはスクロール表示
```
$ cat /etc/crontab | less
```
Ctrl + zで戻り(停止)jobsコマンドで表示
```
$ jobs
[1]+  Stopped           cat /etc/crontab | less
```
fgコマンドにジョブ番号を指定するとスクロールが再開される
```
$ fg 1
```
:qで終了後に再びjobsコマンドで確認すると
```
$ jobs
$
```
表示されないためジョブが終了していることが確認できた。

# バックグラウンド
バックグラウンドはユーザーからは見えず、対話的な操作ができない状態

### ジョブをバックグラウンドに変更する(bgコマンド)
バックグラウンドに変更する場合はbgコマンドを使用する。
```
$ sleep 30
^Z
[1]+  Stopped          sleep 30
$ bg %1
[1]+  sleep 30 &
$ jobs
[1]+  Running          sleep 30 &
$ jobs
[1]+  Done             sleep 30 
```
sleep 30で30秒待機する状態をつくり、Ctrl + zで停止。
bgコマンドでジョブ番号1を指定してバックグラウンドにしている(末尾に&がつく)
バックグラウンドで実行されていることからjobsコマンドを同じシェルで実行できていることが確認できた。
そして最後には30秒経過していることが確認できた。

### バックグラウンドで実行する
上記の内容を最初からバックグラウンドで実行する。
コマンドの末尾に&をつける。
```
$ sleep 30 &
[1] 1709
$ jobs
[1]+  Running          sleep 30 &
$ jobs
[1]+  Done             sleep 30 
```
jobsコマンドで確認。こちらも末尾に&がついていることからバックグラウンドで実行されていることがわかる。
30秒後に再度確認するとDoneで30秒経過していることも確認できた。

# プロセス、ジョブの終了(killコマンド)
プロセスやジョブを終了させたい場面の方法を学ぶ。
たとえば操作を誤ってしまった時などが挙げられる。
### プロセスを終了させる場合
```
$ sleep 30 &
$ ps
  PID TTY           TIME CMD
1498  tty1      00:00:00 bash
1610  tty1      00:00:00 bash
1711  tty1      00:00:00 sleep
1712  tty1      00:00:00 ps
$ kill 1711
$ ps
  PID TTY           TIME CMD
1498  tty1      00:00:00 bash
1610  tty1      00:00:00 bash
1712  tty1      00:00:00 ps
[1]+  Terminated             sleep 30 
```
30秒バックグラウンドで待機する状態をつくり、プロセスを表示。
killコマンドからプロセスID1711を指定して終了させる。
再度psコマンドで確認すると"Terminated"=プロセスの終了　が確認できた。
ちなみに終了が可能なのはプロセスの実行ユーザーかrootユーザーのみである。

### バックグラウンドジョブ・停止中のジョブの終了
バックグラウンドジョブの場合
```
$ sleep 30 &
$ jobs
[1]+  Running                sleep 30 &
$ kill %1
[1]+  Terminated             sleep 30 
```
停止中のジョブの場合
```
$ sleep 30 
^Z
[1]+  Stopped                sleep 30 &
$ kill %1
[1]+  Stopped                sleep 30 &
$ jobs
[1]+  Terminated             sleep 30 
```
### フォアグラウンドジョブの終了
フォアグラウンドジョブを終了する場合はCtrl + cを使用する
これはフォアグラウンドジョブが実行されている際には別のコマンドは実行できないためである。
```
$ sleep 30 
^C
$ jobs
$ 
```
最後に何も表示されないことからもフォアグラウンドジョブが終了できていることが確認できた。

# シグナルとは
シグナルはプロセスに送信される信号のこと。シグナルを送ることでプロセスの操作が可能となる。
シグナルの種類はkillコマンドの-lオプションを使うことで一覧表示ができる。
```
1) SIGHUP      2) SIGINT      3)SIGQUIT      4) SIGILL      5) SIGTRAP
```
このような形。(実際にはもっと多数の表示)
先頭に"SIG"とついていることがわかる。HUPというシグナルはSIGHUPと書かれる。
これらのシグナルをkillコマンドでプロセスに送信することで操作が可能。
killコマンドの引数に、シグナル、対象のプロセスを指定する。
例えばシグナル名KILLのSIGKILLでsleepコマンド(プロセスID1744)を強制終了させる場合は
```
$ kill -9 1744
$ jobs -l
[1]+  1744 Killed             sleep 30 
```
強制終了できていることが確認できた。
例えば異常が発生してプロセスを強制終了させたいときに使うことができる。
そして引数を指定していないkillコマンドは何をしているかというとTERMシグナルが送信されている。
このTERMシグナルはプロセスを終了させることができるために、killコマンドの使用=プロセスの終了となる。

# おつかれまでした
前回に引き続き主にプロセスとジョブの学習でした。
psコマンドやjobsコマンドを何度も使用して確認することでイメージがつきにくかった概念も理解してきたという実感があります。
そしてこれは前々回？に書いたことでもあり、当たり前のことですが、とにかく用語が増えてきたと思います。
現場ではおそらく用語が飛び交い、わかりません、では余計に時間を食ってしまいます。そのためしっかりと押さえておくことです。自分の記事の内容くらいは見返さなくても理解し、扱えるようになっておきたいです。