LPIC 勉強記録 第3章 プロセス管理

#第3章 プロセス管理

`プロセス`とは、実行中のプログラムのこと
システムでは、常に複数のプロセスが稼働している
ユーザがコマンドを実行することによって、プロセスは生成され、プログラムの終了とともに消滅する

新しいプロセスは、親プロセスが自分のコピーである子プロセスの生成をカーネルにリクエストし、次に生成された子プロセスの中身が新しいプログラムコードに入れ替わる、という仕組みで生成される

| 主なviコマンド | 説明 | 
|:----------|:----------|
|ps|プロセスの情報を表示する基本的なコマンド|
|pstree|プロセスの親子関係をツリー構造で表示する|
|top|プロセスの情報を周期的にリアルタイムに表示する|

| 種類| 主なオプション | 説明|
|:----------|:---------|:----------|
|UNIX|-e|すべてのプロセスを表示する|
|UNIX|-f|詳細情報を表示する|
|UNIX|-l|長いフォーマットで詳細情報を表示する|
|UNIX|-o|ユーザ定義のフォーマットで表示する|
|BSD|a|すべてのプロセスを表示する|
|BSD|u|詳細情報を表示する|
|BSD|x|制御端末のないプロセス情報も表示する|

`ps -lコマンド`もしくは`topコマンド`を使用することで、`NI項目`が表示され、優先度を確認できる
`NI`は優先度を`nice値`で表示し、小さな値ほど優先度が高いことを表す

`topコマンド`は、前回の更新から現在までの間でCPU使用率の高い順に、周期的にプロセスの情報を表示する

`freeコマンド`は、システムの空きメモリと利用メモリの量を表示する

`SysV init`では、Linuxが起動すると、カーネルから生成される最初のプロセスである`init`が、サービスのための`デーモン`と呼ばれるプロセスを生成する
したがって、システムが起動すると、`init`を頂点とするプロセスの階層構造が形成される
`initプロセス`のPIDは`1`
最近のディストリビューションでは、サービスの管理は、`SysV init`に代わり、`systemd`が採用されている
`systemd`のデーモン`/sbin/systemd`は`/sbin/init`とリンクされた同じプログラムで、`SysV init`のinitと同じく、カーネルから起動される最初のユーザプロセス

システムが起動すると、`systemd`を頂点とするプロセスの階層構造が形成される
この親子関係をツリー形式で表示するのが`pstreeコマンド`

1個のCPUを持つシステムでは、ある時点でCPUが実行するプロセスは1つ
実際には、`タイムスライス`と呼ばれる、ごく短い時間でプロセスを切り替えていて、そのたびに別のプロセスをCPUに割り当てて実行している
CPUによる実行を待つプロセスのうち、どれを実行するかはプロセスの優先度(プライオリティ)を基に決定される

| 優先度 | 説明 | 
|:----------|:----------|
|動的優先度|静的優先度とCPU使用時間を基に計算され、CPUを使うほど優先度は低くなる。カーネル内部で100〜139の範囲の値を持つ|
|静的優先度|nice値により一定範囲でユーザが設定可能。カーネル内部で100〜139の範囲の値を持つ|

カーネルのスケジューラは動的優先度を基に、次に実行するプロセスを選定する
静的優先度はプロセスの`nice値`によって決まる
`nice値`は`-20〜19`の値で変更できるが、これをそのまま`100〜139`にずらした値がカーネル内部での優先度となる

カーネル内部の優先度`0〜99`は、`リアルタイムプロセス`に割り当てられる
優先度は`psコマンド`の`-cオプション`あるいは`-o priオプション`あるいは`-lオプション`による実行での`PRIフィールド`で確認できる

`niceコマンド`を使用することで、プロセスの優先度を変更することができる
オプションで数値を指定しないとデフォルト`(0) +10`の優先度を付与する
優先度にマイナス値を指定可能なのは、root権限を持つユーザのみ
`$ nice -n 19 bc`

動作中のプロセスの優先度の変更には`reniceコマンド`もしくは`topコマンド`を使用する

`reniceコマンド`のオプションには、新たに付与したい優先度を数値で指定し、また、変更対象のプロセスを明示するため、`-pオプション`でPIDを指定する
マイナス値の設定には、root権限が必要
`$ renice 15 -p 19942`

`ジョブ`とは、コマンドライン1行で実行された処理単位のこと
ジョブはシェルごとに管理され、`ジョブID`が振られる
1行のコマンドラインで複数のコマンドが実行された場合でも、その処理全体を1つのジョブとして扱う

| ジョブ | 説明 | 
|:----------|:----------|
|フォアグラウンドジョブ|キーボードと端末画面を占有して、対話的な操作をするジョブ。そのジョブが終了するまで、端末画面上には次のプロンプトが表示されない。シェルごとに1つのみ|
|バックグラウンドジョブ|キーボード入力を受け取ることができないジョブ。画面への出力は設定によっては抑制される。複数のジョブを同時に実行することが可能|

| コマンド | 説明 | 
|:----------|:----------|
|jobs|バックグラウンドジョブと一時停止中のジョブを表示|
|[Ctrl]+[z]|実行しているジョブを一時停止にする|
|bg %ジョブID|指定したジョブをバックグラウンドに移行|
|fg %ジョブID|指定したジョブをフォアグラウンドに移行|

`&`を付けて実行すると、`バックグラウンドジョブ`として実行される

実行シェル内で、特定のプログラムを1つ起動している場合は、ジョブIDではなく名前でも可能
同じシェル内で同じプログラムを複数起動している場合は、名前を指定するとエラーとなる

ログアウトしてもプログラムを実行し続けるには、`nohupコマンド`を使用する
数日かかるような処理で、ログアウトしても処理を続けたい場合などに有効
標準出力と標準エラー出力は、カレントディレクトリに`nohup.out`というファイル名でリダイレクトする
書き込めない場合は、ホームディレクトリへ`nohup.out`というファイル名でリダイレクトする

システムが稼働し続けている期間を調べるために、`uptimeコマンド`が提供されている
現在の時刻、システムの稼働期間、現在ログインしているユーザ数等、過去1、5、15分のシステム負荷平均を表示する

`シグナル`とは、割り込みによってプロセスに特定の動作をするように通知するための仕組み
通常、プロセスは処理を終えると自動的に消滅するが、プロセスに対して`シグナル`を送信することで、外部からプロセスを終了させることができる

| シグナル番号| シグナル名 | 説明|
|:----------|:---------|:----------|
|1|SIGHUP|端末の切断によるプロセスの終了|
|2|SIGINT|割り込みによるプロセスの終了([Ctrl]+[c]で使用)|
|9|SIGKILL|プロセスの強制終了|
|15|SIGTERM|プロセスの終了(デフォルト)|
|18|SIGCONT|一時停止したプロセスを再開する|
|20|SIGTSTP|プロセスを一時停止する([Ctrl]+[z]で使用)|

`killコマンド`で明示的にシグナルを指定しない場合は、`SIGTERM(15)`が送信される
`-lオプション`を付けて実行すると、シグナル名の一覧が表示される
`-sオプション`は、シグナルを送信するオプション
ジョブIDを指定するには、`%`を使用する
プログラムを終了する前に、アプリケーションごとに必要な`クリーンアップ(終了処理)`の処理を行ってから、自分自身でプロセスを終了する
`クリーンアップ`では、使っていたリソースの解放や、ロックファイルの解除などを行う
やむを得ない場合は、`SIGKILL(9)`を使用して強制終了させる

プロセス名を指定してシグナルを送信する際には、`killallコマンド`を使用する
同じ名前のプロセスが複数存在し、それらをまとめて終了したい場合に有効
`SIGUSR1シグナル`は、システムが使用するシグナルではなく、ユーザが作成するアプリケーションで、その処理を独自の目的のために自由に定義して使用できるシグナル

`watchコマンド`は指定されたコマンドを繰り返し実行し、その結果を表示する
プログラムの出力の経時変化を監視できる
デフォルトでは2秒おきに実行されるが、時間の間隔を変えたい場合は、`-n`または`--interval`を指定する

`tmux`は、1つの物理的な端末画面から多数の端末を作成、アクセス、および制御することができる文字型端末の画面制御プログラム
1つの画面の中で複数の画面を起動して作業できる
`tmux`が起動すると、1つのセッションが作成され、1つのウィンドウが用意される
作業途中の状態で、セッションを終了させ(デタッチ)、また再接続する(アタッチ)ことができるため、再接続時に引き続き作業に取りかかれる

#終わりに
3周目終了
バックグラウンドジョブとフォアグラウンドジョブのパートがイマイチよく分かっていない
細かい部分も、もう少し精緻に覚えていく必要がありそう
次は4章！！！！