クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

プログラムを正しく止める(プロセスとシグナル)

このレッスンのあとで: プロセスを見つけて、正しい方法で止めることができる。

50分のレッスンコマンド15件毎日使う Linux コマンドのラボ:エンジニアが暗記している30のコマンド

固まったレジのプログラム

店のレジのプログラムが、いちばん忙しい時間に反応しなくなりました。店長は、サーバ全体を再起動したくありません。ほかに40のプログラムが動いているからです。

固まった1つだけを見つけて止め、ほかには触れない。それが今日の仕事です。

このレッスンのゴール

メモ

プロセスを見つけて、正しい方法で止めることができる。

キーワード

ことばいみれい
プロセス今、動いているプログラム
PID1つのプロセスを指す番号4162
シグナルプロセスに送る短い合図TERM
フォアグラウンドその端末で、今キーボードを受け取っているプロセス
バックグラウンド別のことを打つあいだも動き続けるプロセス
ジョブシェルが起動して、一覧に持っているプロセス[1]

学生が入力するセルは、このプレビューでは空白です。

動いているプログラムはプロセス

プログラムを起動すると、システムはそのためのプロセスを作ります。プロセスには番号が付きます。これがPIDです。

プロセスには、持ち主、開始時刻、親もあります。親とは、それを起動したプロセスです。

マシンで最初のプロセスは、PIDが1です。Ubuntu では systemd です。ほかのプロセスは、ほとんどがそこから枝分かれして生まれます。

このセッションのプロセス

コマンド
ps

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

全プロセスから、ラボのものだけに絞る

コマンド
ps -ef | grep lab-

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

worker のPIDだけ

コマンド
pgrep -f lab-worker

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: ps -ef の1行

列例意味
UIDstudentプロセスの持ち主
PID4162プロセスを指す番号
PPID1親のPID
STIME17:59始まった時刻
CMD/bin/bash /usr/local/bin/lab-worker動いているコマンド

学生が入力するセルは、このプレビューでは空白です。

シグナルでプロセスに止まるよう頼む

プロセスを止めるには、シグナルを送ります。kill 4162 はシグナル15、名前はTERMを送ります。「終わってください」という頼みです。ふつうのプログラムは、仕事を保存して終わります。

kill -9 4162 はシグナル9、名前はKILLです。システムがすぐにプロセスを取り除きます。プログラムは後片づけができません。

知っておきたい4つのシグナル

番号名前働き
15TERM終わるよう頼む。何も言わなければこれ
9KILLプロセスを取り除く。無視できない
2INTCtrl+C が送るもの
1HUP設定を読み直して、という意味によく使う

学生が入力するセルは、このプレビューでは空白です。

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

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

このラボとソースについて: 毎日使う Linux コマンドのラボ:エンジニアが暗記している30のコマンド

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。