固まったレジのプログラム
店のレジのプログラムが、いちばん忙しい時間に反応しなくなりました。店長は、サーバ全体を再起動したくありません。ほかに40のプログラムが動いているからです。
固まった1つだけを見つけて止め、ほかには触れない。それが今日の仕事です。
このレッスンのゴール
メモ
プロセスを見つけて、正しい方法で止めることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| プロセス | 今、動いているプログラム | |
| PID | 1つのプロセスを指す番号 | 4162 |
| シグナル | プロセスに送る短い合図 | TERM |
| フォアグラウンド | その端末で、今キーボードを受け取っているプロセス | |
| バックグラウンド | 別のことを打つあいだも動き続けるプロセス | |
| ジョブ | シェルが起動して、一覧に持っているプロセス | [1] |
学生が入力するセルは、このプレビューでは空白です。
動いているプログラムはプロセス
プログラムを起動すると、システムはそのためのプロセスを作ります。プロセスには番号が付きます。これがPIDです。
プロセスには、持ち主、開始時刻、親もあります。親とは、それを起動したプロセスです。
マシンで最初のプロセスは、PIDが1です。Ubuntu では systemd です。ほかのプロセスは、ほとんどがそこから枝分かれして生まれます。
このセッションのプロセス
psここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
全プロセスから、ラボのものだけに絞る
ps -ef | grep lab-ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
worker のPIDだけ
pgrep -f lab-workerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: ps -ef の1行
| 列 | 例 | 意味 |
|---|---|---|
| UID | student | プロセスの持ち主 |
| PID | 4162 | プロセスを指す番号 |
| PPID | 1 | 親のPID |
| STIME | 17:59 | 始まった時刻 |
| CMD | /bin/bash /usr/local/bin/lab-worker | 動いているコマンド |
学生が入力するセルは、このプレビューでは空白です。
シグナルでプロセスに止まるよう頼む
プロセスを止めるには、シグナルを送ります。kill 4162 はシグナル15、名前はTERMを送ります。「終わってください」という頼みです。ふつうのプログラムは、仕事を保存して終わります。
kill -9 4162 はシグナル9、名前はKILLです。システムがすぐにプロセスを取り除きます。プログラムは後片づけができません。
知っておきたい4つのシグナル
| 番号 | 名前 | 働き |
|---|---|---|
| 15 | TERM | 終わるよう頼む。何も言わなければこれ |
| 9 | KILL | プロセスを取り除く。無視できない |
| 2 | INT | Ctrl+C が送るもの |
| 1 | HUP | 設定を読み直して、という意味によく使う |
学生が入力するセルは、このプレビューでは空白です。
15番の名前は?
kill -l 15ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
9番の名前は?
kill -l 9ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ラボの2つのプログラムを止める
PIDを手で打つのは遅く、Runボタンは皆さんのPIDを知りません。pkill -f 名前 は、名前でプロセスを探して、シグナルを送ります。
worker は、ふつうの頼みで終わります。stubborn は、それを無視します。各ステップのあと、pgrep が何を出すかを見ましょう。何も出なければ、そのプロセスはありません。
worker に終わるよう頼む
pkill -f lab-workerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
まだいるか?
pgrep -f lab-workerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
stubborn に頼む
pkill -f lab-stubbornここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
まだいるか?
pgrep -f lab-stubbornここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
今度はシグナル9で取り除く
pkill -9 -f lab-stubbornここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
これでどうか?
pgrep -f lab-stubbornここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「kill -9 は、強い kill だ」と考えて、最初から使う人が多くいます。kill なら、プログラムは保存と後片づけができます。kill -9 はそれをさせず、書きかけのファイルを残すことがあります。まずTERMを送り、数秒待ち、止まらないときだけ9を使いましょう。
フォアグラウンド、バックグラウンド、top
起動したプログラムは、フォアグラウンドで動きます。終わるまでキーボードを受け取ります。Ctrl+C はシグナル2を送り、たいてい止まります。
コマンドの終わりに & を付けると、バックグラウンドで動きます。シェルはこれをジョブとして [1] のように数えます。
top を打つと、忙しいプロセスをその場で見られます。q で出ます。Runは q を押せないので、これは自分で打ってください。
5分の待ちをバックグラウンドで始める
sleep 300 &ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ジョブの一覧
jobsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1番のジョブを止める
kill %1ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
忙しい上位3つを1回だけ見る
ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu | head -n 4ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。