103.5 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
103 GNUとUnixコマンド |
Objective: |
103.5 プロセスの作成、監視、強制終了 |
Lesson: |
1 of 2 |
はじめに
コマンドを実行すると、1つ以上のプロセスが開始されます。熟達したシステム管理者は、プロセスを作成するだけでなく、プロセスを追跡し、必要に応じてさまざまなタイプのシグナルを送信できなければなりません。このレッスンでは、ジョブ制御とプロセス監視について説明します。
ジョブ制御
パイプを使用した場合など、ターミナルから実行する1つのコマンドラインで、複数のプログラム(プロセス)が実行されることがあります。シェルは、それらのプロセスをまとめて、1つの「ジョブ」として管理します。jobs コマンドを実行すると、バックグラウンドで実行中のジョブ(とそのステータス)を確認することができます。
$ jobs
上記の jobs
コマンドの例では出力がありませんでした。現在アクティブなジョブが存在しないからです。このレッスンで見る最初のジョブを作成してみましょう。実行が完了するまでに時間がかかるコマンド(パラメータが 60
の sleep
コマンド)を実行し、そのコマンドの実行中にCtrl+Zを押します。
$ sleep 60 ^Z [1]+ Stopped sleep 60
コマンドの実行が停止され(より正確に言うとサスペンドされ)、コマンドプロンプトが再び使えるようになります。もう一度ジョブを探してみましょう。今度は サスペンドされた ジョブを見つけることができます。
$ jobs [1]+ Stopped sleep 60
出力内容を説明します。
[1]
-
この番号はジョブIDです。
fg
、bg
、kill
ユーティリティで、パーセント記号(%
)の後にこのジョブIDを指定することにより、ジョブのステータスを変更することができます(後で示します)。 +
-
プラス記号は、現在のデフォルトのジョブ(最後にサスペンドされたジョブ、または、最後にバックグラウンドへと送られたジョブ)を示します。最後から一つ前のジョブにはマイナス記号(
-
)のフラグが付けられます。それ以前のジョブにはフラグが付けられません。 Stopped
-
ジョブステータスの説明。
sleep 60
-
ジョブのコマンドライン。
-l
オプションを使用すると、jobsコマンドは、ステータスの直前にプロセスID(PID)を追加で表示します。
$ jobs -l [1]+ 1114 Stopped sleep 60
jobsコマンドの他のオプションは次のとおりです。
-n
-
ステータスが変化したプロセスのみを一覧表示します。ステータスには、
実行中
、停止
、終了
ないし完了
などがあります。 -p
-
プロセスIDを一覧表示します。
-r
-
実行中のジョブのみを一覧表示します。
-s
-
停止された(サスペンドされた)ジョブのみを一覧表示します。
Note
|
ジョブには ジョブID と プロセスID (PID)の2つのIDがあります。 |
ジョブ指定
jobs
コマンドや fg
、bg
、kill
などの他のユーティリティ(次のセクションで説明します)では、ジョブを指定するためにジョブ指示子(jobspec
)を使います。通常は、%
の後にジョブIDの数値を指定しますが、以下に述べるような指示方法もあります。
%n
-
ジョブIDが
n
のジョブ$ jobs %1 [1]+ Stopped sleep 60
%str
-
コマンドラインが
str
で始まるジョブ$ jobs %sl [1]+ Stopped sleep 60
%?str
-
コマンドラインに
str
が含まれているジョブ$ jobs %?le [1]+ Stopped sleep 60
%+
または%%
-
現在のジョブ(最後にバックグラウンドで開始されたジョブ、または、フォアグラウンドから一時停止されたジョブ)
$ jobs %+ [1]+ Stopped sleep 60
%-
-
現在のジョブから一つ前のジョブ
$ jobs %- [1]+ Stopped sleep 60
上の例では、ジョブが1つしかないため、そのジョブが、現在のジョブ(%+
)と一つ前のジョブ(%-
)の両方に当てはまります。
ジョブのステータス:サスペンド、フォアグラウンド、バックグラウンド
ジョブがバックグラウンドにあるとき、またはサスペンドされているときには、次の3つの操作を実行できます。
-
fg
でフォアグラウンドに移動させます。$ fg %1 sleep 60
fg
は指定されたジョブをフォアグラウンドに移動させ、そのジョブを現在のジョブにします。これで、終了するまで待つか、Ctrl+Zで再度停止させるか、Ctrl+Cで終了させることができるようになります。 -
bg
でジョブをバックグラウンドに移動させます。$ bg %1 [1]+ sleep 60 &
バックグラウンドにあるジョブは
fg
でフォアグラウンドに戻すか、強制終了することができます(以下を参照)。ジョブがバックグラウンドに送られたことを意味するアンパサンド(&
)に注意してください。実は、アンパサンドをコマンドの後に付ければ、直接バックグラウンドでプロセスを開始することもできます。$ sleep 100 & [2] 970
新しいジョブのジョブID(
[2]
)とともに、プロセスID(970
)も表示されました。これで、2つのジョブがバックグラウンドで実行されている状態になります。$ jobs [1]- Running sleep 60 & [2]+ Running sleep 100 &
しばらくすると、1つ目のジョブが実行を終了します。
$ jobs [1]- Done sleep 60 [2]+ Running sleep 100 &
-
kill
コマンドによりSIGTERM
を送信してジョブを終了します。$ kill %2
ジョブが終了したことを確認するには、
jobs
を再度実行します。$ jobs [2]+ Terminated sleep 100
Note
|
ジョブが指定されていない場合、 |
切り離されたジョブ: nohup
ここまで見てきたジョブは、そのジョブを呼び出したユーザーのセッションに関連付けられていました。セッションが終了すると、セッションに関連付けられたジョブは失われます。ただし、セッションからジョブを切り離して、セッションが閉じられた後でもジョブを実行し続けることも可能です。これは、nohup
(“no hangup”)コマンドで実現されます。構文は次のとおりです。
nohup COMMAND &
&
はプロセスをバックグラウンドに送り、作業中の端末を解放するということを思い出してください。
バックグラウンドのジョブ ping localhost
を現在のセッションから切り離してみましょう。
$ nohup ping localhost & [1] 1251 $ nohup: ignoring input and appending output to 'nohup.out' ^C
コマンドを実行すると、ジョブID([1]
)とPID(1251
)が表示され、次の行には、ファイル nohup.out
に出力が追記される旨のメッセージが表示されます。このnohup.outファイルは、nohupでコマンドを実行したときに stdout
と stderr
の出力が保存されるデフォルトのファイルです。Ctrl+Cを押してコマンドプロンプトを解放し、exitと入力していったんログアウトしてセッション(ターミナル)を閉じ、(別のターミナルウィンドウを開くなどして)新しいセッション(ターミナル)をスタートしてください。tail -f
を使用すると、先ほどのコマンドが実行され続けており、そのコマンドの出力がデフォルトファイル(nohup.out)に書き込まれていることを確認できます。
$ exit logout $ tail -f /home/carol/nohup.out 64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.070 ms 64 bytes from localhost (::1): icmp_seq=4 ttl=64 time=0.068 ms 64 bytes from localhost (::1): icmp_seq=5 ttl=64 time=0.070 ms ^C
Tip
|
デフォルトの |
プロセスを強制終了する場合は、PIDを指定する必要があります。
# kill 1251
プロセス監視
プロセス(タスク)は、実行中のプログラムのインスタンスです。したがって、端末にコマンドを入力するたびに、新しいプロセスが作成されます。
watch
コマンドは、プログラムを一定間隔(デフォルトは2秒)ごとに実行し、プログラムの出力が時によって変化していくのを 監視 することができます。たとえば、watch uptime
というコマンドを実行すると、プロセスの増加に伴ってロードアベレージ(負荷の平均)がどのように変化するかを監視できます。
Every 2.0s: uptime debian: Tue Aug 20 23:31:27 2019 23:31:27 up 21 min, 1 user, load average: 0.00, 0.00, 0.00
watchコマンドは割り込みを受けるまで実行されるため、Ctrl+Cで停止させます。停止させるまでは2行の出力が表示されます。1行目は watch
からの出力で、コマンドが実行される頻度(Every 2.0s: uptime
)、監視しているプログラム(uptime
)、ホスト名と日付(debian: Tue Aug 20 23:31:27 2019
)です。2行目はuptimeの出力で、現在時刻(23:31:27
)、システムが稼働している時間(up 21 min
)、アクティブユーザーの数(1 user
)、左から過去1、5、15分間についてのロードアベレージ(実行中ないし待機中のプロセス数の平均)(load average: 0.00, 0.00, 0.00
)です。
同様に、watch free
で、プロセスの増減に伴って変化するメモリ使用量を確認できます。
Every 2.0s: free debian: Tue Aug 20 23:43:37 2019 23:43:37 up 24 min, 1 user, load average: 0.00, 0.00, 0.00 total used free shared buff/cache available Mem: 16274868 493984 14729396 35064 1051488 15462040 Swap: 16777212 0 16777212
watch
の更新間隔を変更するには、次のように -n
または --interval
オプションと秒数を指定します。
$ watch -n 5 free
これで、free
コマンドが5秒ごとに実行されます。
uptime
、free
、watch
のオプションの詳細については、それぞれの項目のマニュアルページを参照してください。
Note
|
|
プロセスへのシグナルの送信: kill
すべてのプロセスには、一意のプロセス識別子すなわちPIDがあります。プロセスのPIDを調べる方法の一つは、pgrep
コマンドに続けてプロセスの名前を入力することです。
$ pgrep sleep 1201
Note
|
プロセス識別子(PID)は、 |
pgrep
と同様に、pkill
コマンドは、プロセスの名前に基づいて、プロセスを強制終了します。
$ pkill sleep [1]+ Terminated sleep 60
同じ名前のプロセスの複数のインスタンスを強制終了するには、killall
コマンドを使用します。
$ sleep 60 & [1] 1246 $ sleep 70 & [2] 1247 $ killall sleep [1]- Terminated sleep 60 [2]+ Terminated sleep 70
pkill
と killall
はどちらも kill
とほとんど同じように機能します。これらのコマンドは、指定されたプロセスにシグナルを送信します。シグナルを指定しない場合、デフォルトの SIGTERM
が送信されます。ただし、kill
の引数は、ジョブIDかプロセスIDのいずれかで、pkill
や killall
のようにプロセスの名前を引数に取ることはできません。
シグナルは次のいずれかで指定できます。
-
名前:
$ kill -SIGHUP 1247
-
シグナル番号:
$ kill -1 1247
-
-sオプションとシグナル名ないしシグナル番号:
$ kill -s SIGHUP 1247
kill
を pkill
または killall
と同じように機能させる(そして最初にPIDを見つけるためにコマンドを実行する手間を省く)には、コマンド置換を使用します。
$ kill -1 $(pgrep sleep)
すでにご存知のとおり、コマンド置換の別の構文は kill -1 `pgrep sleep`
です。
Tip
|
|
top
と ps
プロセス監視には、top
と ps
の2つが欠かせないツールです。前者(top)はリアルタイムの状態を動的に出力するのに対し、後者(ps)はその時点の状態を静的に出力します。いずれにせよ、どちらもシステムのすべてのプロセスを包括的に把握するための優れたユーティリティです。
top
を対話的に使う
top
を呼び出すには、単に top
と入力します。
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
top
は対話的に利用できます。デフォルトでは、出力は各プロセスで使用されているCPU時間(CPU使用率)の降順でソートされます。この表示順序は、top
内から次のキーを押すことで変更できます。
M
-
メモリ の使用量でソートします。
N
-
プロセスID でソートします。
T
-
実行 時間 でソートします。
P
-
CPU使用率 でソートします。
Tip
|
降順と昇順を切り替えるには、 |
top
にコマンドを与えるキーは次のとおりです。
?
またはh
-
ヘルプ。
k
-
プロセスを強制終了します。強制終了するプロセスの
PID
と、送信するシグナル(デフォルトではSIGTERM(15)
)の入力を要求されます。 r
-
プロセスの優先度を変更します(
renice
)。nice
値の入力を要求されます。可能な値の範囲は-20〜19ですが、負の値や現在の値よりも低い値に設定できるのはスーパーユーザー(root
)のみです。 u
-
指定したユーザーのプロセスを一覧表示します(デフォルトでは、すべてのユーザーのプロセスが表示されます)。
c
-
プログラムの絶対パスを表示し、ユーザー空間のプロセスとカーネル空間のプロセスを区別します(角括弧内のプロセスはカーネル空間のプロセス)。
V
-
プロセスの親子関係をツリー状に表示します。
t
とm
-
それぞれ、CPU使用率とメモリ使用量をグラフ様に表示します。表示方法は4パターンあり、1)個別の値をテキスト表示、2)代表値とバーグラフ、3)代表値と棒グラフ、4)非表示、の順に切り替わります。
W
-
設定を
~/.toprc
に保存します。
Tip
|
類似のコマンドとして、洗練されたユーザーインターフェイスの |
top
の出力の説明
top
の出力は、サマリエリア と タスクエリア の2つの領域に分けられます。
top
のサマリエリア
上部の5行が サマリエリア で、次の情報が表示されます。
-
top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14
-
現在時刻(24時間形式):
11:20:29
-
稼働時間(システムが起動してからの時間):
up 2:21
-
ログイン中のユーザー数と過去1、5、15分間のCPUのロードアベレージ:
load average: 0,11, 0,20, 0,14
-
-
Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
(プロセスに関する情報)-
アクティブなプロセスの総数:
73 total
-
実行中のプロセス数:
1 running
-
スリープ状態(入出力待ちなどで待機中)のプロセス数:
72 sleeping
-
ジョブ制御により停止中のプロセス数:
0 stopped
-
ゾンビ(実行を完了したが、親プロセスによりプロセステーブルから削除されるのを待機しているプロセス):
0 zombie
-
-
%Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
(使用されているCPU時間の割合)-
ユーザープロセス:
0,0 us
-
システム/カーネルプロセス:
0,3 sy
-
nice 値が設定されたユーザープロセス:
0,0 ni
-
待機 — アイドルCPU時間:
99,7 id
-
入出力を待機しているプロセス:
0,0 wa
-
周辺機器機からのハードウェア割り込み処理に費やされたCPU時間:
0,0 hi
-
ソフトウェア割り込み処理に費やされたCPU時間:
0,0 si
-
仮想化環境において、現在の環境が利用できなかった(ハイパーバイザなどにstealされた)CPU時間:
0,0 st
-
-
KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache
(キロバイト単位のメモリ情報)-
メモリの合計量:
1020332 total
-
未使用メモリ:
909492 free
-
使用中メモリ:
38796 used
-
ディスクキャッシュとして使用されているメモリ:
72044 buff/cache
total
は、free
とused
とbuff/cache
の3つ値の合計であることに注意してください(この場合は約1 GB)。
-
-
KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem
(キロバイト単位のスワップ情報)-
スワップ領域の合計量:
1046524 total
-
未使用のスワップ領域:
1046524 free
-
使用中のスワップ領域:
0 used
-
スワップを発生させずに割り当てることができるメモリ量:
873264 avail Mem
-
top
のタスクエリア:フィールドと列
サマリエリア の下には タスクエリア があります。これには、実行中のプロセスに関する情報を伝える一連の フィールド が含まれています。
PID
-
プロセスID。
USER
-
プロセスを実行したユーザー。
PR
-
プロセスの優先度。
NI
-
プロセスのnice値。値が低いほど優先度が高い。
VIRT
-
プロセスによって使用されているメモリの総量(スワップを含む)。
RES
-
プロセスによって使用されている物理メモリ。
SHR
-
他のプロセスとの共有メモリ。
S
-
プロセスのステータス。
S
(割り込み可能なスリープ - イベントが終了するのを待機しているプロセス)、R
(実行可能 - 実行中または実行待ちのキュー内にあるプロセス)、Z
(ゾンビ - 終了したがプロセステーブルから削除されていないプロセス)。 %CPU
-
プロセスのCPU使用率。
%MEM
-
プロセスの物理メモリ使用率。つまり、
RES
を利用可能な物理メモリ容量で割った値のパーセント表示。 TIME+
-
プロセスが消費したCPU時間の合計。
COMMAND
-
プロセスを開始したコマンド。
プロセスを静的に表示する: ps
前述のように、ps
はプロセス状態のスナップショットを示します。現在のターミナル(tty)から起動されたすべてのプロセスを表示するには、ps a
と入力します。
$ ps a PID TTY STAT TIME COMMAND 386 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux 424 tty7 Ssl+ 0:00 /usr/lib/xorg/Xorg :0 -seat seat0 (...) 655 pts/0 Ss 0:00 -bash 1186 pts/0 R+ 0:00 ps a (...)
ps
オプションのスタイルと出力の説明
psコマンドは、オプションの指定方法に3つのスタイルがあります。BSDスタイル、UNIXスタイル、GNUスタイルの3つです。指定したプロセスIDに関する情報を出力するときに、それぞれのスタイルでどうなるかを見てみましょう。
- BSD
-
オプションにハイフンをつけません。
$ ps p 811 PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su
- UNIX
-
オプションにハイフンをつけます。
$ ps -p 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
- GNU
-
オプションに2個のハイフンをつけます。
$ ps --pid 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
これら3つのpsコマンドは、いずれも、PID
が 811
であるプロセス(この場合は bash
)に関する情報を出力します。
同様に、ps
では、ユーザーを指定してそのユーザーが開始したプロセスを検索することもできます。
-
ps U carol
(BSD) -
ps -u carol
(UNIX) -
ps --user carol
(GNU)
carol
が開始したプロセスを調べてみましょう。
$ ps U carol PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su 898 pts/0 R+ 0:00 ps U carol
彼女は2つのプロセスを開始しました。 bash
(-su
)と ps
(ps U carol
)です。STAT
列は、プロセスの状態を示します(以下を参照)。
psを最大限に活用するためには、さまざまなオプションを組み合わせます。たくさんのオプションがありますが、まず覚えておくと良いのが、BSDスタイルの ps aux
です。このコマンドは、top
コマンドと同様に、(現在のターミナルから実行したものだけではなく)すべてのプロセスを表示します。オプションの意味は次のとおりです。
a
-
ターミナル(
tty
)に接続されているプロセスを表示します。 u
-
ユーザーが読みやすいフォーマットで表示します。
x
-
ターミナルに接続されていないプロセスを表示します。aオプションと併用することで、すべてのプロセスが表示されます。
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 204504 6780 ? Ss 14:04 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:04 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:04 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 14:04 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_sched] root 8 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 14:04 0:00 [migration/0] (...)
各列を説明しましょう。
USER
-
プロセスを実行したユーザー。
PID
-
プロセスID。
%CPU
-
CPUの使用率。
%MEM
-
物理メモリの使用率。
VSZ
-
プロセスが使用している仮想メモリ(KiB単位)。
RSS
-
プロセスが使用しているスワップされていない物理メモリ(KiB単位)。
TT
-
プロセスを制御するターミナル(
tty
)。 STAT
-
プロセスの状態を表すコード。
S
、R
、Z
の3つを、top
の項で説明しました。他には、D
(中断できないスリープ - 通常は入出力を待機しているプロセス)、T
(停止 - 通常は制御シグナルによって停止されたプロセス)があります。さらに、<
(優先度が高い - 他のプロセスよりもnice値が低い)、N
(優先度が低い - 他のプロセスよりもnice値が高い)、+
(フォアグラウンドプロセスグループ)などの修飾子もあります。すべてを覚える必要はありませんから、必要に応じてマニュアルを参照してください。 STARTED
-
プロセスが開始された時刻。
TIME
-
累積CPU時間。
COMMAND
-
プロセスを開始したコマンド。
演習
-
oneko
は、猫がマウスカーソルを追いかける面白いプログラムです。自分のデスクトップシステムにまだインストールされていない場合は、ディストリビューションのパッケージマネージャーを使用してインストールしてください。以下の演習ではこれを使ってジョブ制御を学びます。-
どうやってプログラムを起動しますか?
-
マウスカーソルを動かして、猫がどのように追いかけるかを見てみましょう。次に、プロセスを停止します。どうやってプロセスを停止しますか? 出力内容はどうなりますか?
-
ジョブの数を確認してください。何を入力しますか? 出力内容はどうなりますか?
-
ジョブIDを指定して先ほど確認したジョブをバックグラウンドに送ります。出力内容はどうなりますか? ジョブがバックグラウンドで実行されていることを確認するにはどうしますか?
-
最後に、ジョブIDを指定してジョブを終了させます。何を入力しますか?
-
-
Apache HTTPD Webサーバー(
apache2
)によって生成されたすべてのプロセスのPIDを、2通りのコマンドで調べてください。 -
PIDを使用せずに、すべての
apache2
プロセスを終了させる2種類のコマンドはどうなりますか? -
apache2
のすべてのインスタンスを終了する必要があるのですが、それらのPIDを調べるのは面倒です。ワンライナー(1行のコマンド)として、killでSIGTERMを送信するにはどうしますか? -
top
を起動し、対話的に以下を実行してください。-
プロセスをツリー状に表示してください。
-
ユーザー空間とカーネル空間を区別し、プロセスのフルパスを表示してください。
-
-
ps
コマンドで、Apache HTTPD Webサーバー の所有者(www-data
)が起動したすべてのプロセスを表示してください。-
BSDスタイルを使用する場合。
-
UNIXスタイルを使用する場合。
-
GNUスタイルを使用する場合。
-
発展演習
-
デーモンを再起動するために、
SIGHUP
を送信することがあります。Apache HTTPD Webサーバー を例に取ってみましょう。SIGHUP
を親プロセス(init
ないしsystemd
が起動したプロセス)に送信すると、その子プロセスが強制終了されます。さらに、親プロセスは設定ファイルを再読込して、ログファイルを再度開き、新しい子プロセスを生成します。以下の課題に取り組んでみましょう。-
Webサーバーを起動します。
-
親プロセスのPIDを確認してください。
-
親プロセスに
SIGHUP
を送信してApache HTTPD Webサーバーを再起動します。 -
親プロセスは再起動していないこと、および新しい子プロセスが生成されていることを確認してください。
-
-
ps
はある時点の状態を静的に表示をするコマンドですが、watch
と組み合わせれば、時間による変化を動的に 追いかける ことができます。 Apache HTTPD webサーバー で新しい接続を監視してみましょう。以下で説明するタスクを実行する前に、https://httpd.apache.org/docs/current/mod/mpm_common.html[Apache MPM Common Directives] のMaxConnectionsPerChild
ディレクティブの説明を読むことをお勧めします。-
apache2
の設定ファイルで、MaxConnectionsPerChild
ディレクティブの値を1
にセットします。 - Debian 系では/etc/apache2/apache2.conf
; CentOS 系は/etc/httpd/conf/httpd.conf
が設定ファイルです。設定ファイルの変更を有効にするには、apache2
を再起動することを忘れないでください。 -
apache2
接続を監視するためにwatch
、ps
、grep
を使うコマンドを入力します。 -
ここで、Webブラウザーを開くか、
lynx
などのコマンドラインブラウザーを使用して、IPアドレスでWebサーバーに接続します。watch
の出力結果から何がわかりますか?
-
-
このレッスンで学習したように、
top
はデフォルトでCPU使用率の降順に(最も大きな値が一番上になるように)タスクをソートします。この表示順序は、対話型キーである、M
(メモリ使用量)、N
(プロセスID)、T
(実行時間)、P
(CPU使用率)で変更できます。-o
オプションを指定してtop
を起動すると、タスクリストをもっと細かく好みに合わせて並べ替えることもできます(詳細については、topのman
ページを確認してください)。以下でやってみましょう。-
top
を起動して、タスクがメモリ使用量でソートされるようにしてください。 -
メモリ列を強調表示して、正しいコマンドを入力したことを確認してください。
-
-
ps
にも、表示する列を指定するためのo
オプションがあります。このオプションを調べて、以下を実行してみてください。-
ユーザー、メモリ使用率、CPU使用率、フルコマンド だけが表示されるように、
ps
を起動してください。 -
ユーザーとコマンド名だけが表示されるように、
ps
を起動してください。
-
まとめ
このレッスンでは、ジョブ と ジョブ制御 について学びました。覚えておくべき重要な概念と事柄は次のとおりです。
-
ジョブにまとめられた一群のプロセスを、バックグラウンドに送ることができます。
-
ジョブにはプロセスIDとは別に、ジョブIDが割り当てられます。
-
ジョブを制御するには、ジョブ指示子(
jobspec
)が必要です。 -
ジョブは、フォアグラウンドに移動させたり、バックグラウンドに送ったり、停止や終了(あるいは 強制終了)したりできます。
-
ジョブは、端末やセッションから切り離すことができます。
プロセス と プロセス監視 の概念も説明しました。最も重要な概念は次のとおりです。
-
プロセスは実行中のプログラムです。
-
プロセスの状態を監視できます。
-
さまざまなユーティリティを使用して、プロセスの プロセスID を確認し、プロセスを終了させるためのシグナルを送信できます。
-
シグナルを指定するには、名前(
-SIGTERM
)、番号(-15
)、オプション(-s SIGTERM
)などを使用します。 -
プロセスの状態を監視するには、
top
とps
が役立ちます。前者(top)の出力は動的であり、定期的に更新されます。一方、ps
はある時点でのプロセス状態を静的に表示します。
このレッスンでは以下のコマンドを使用しました:
jobs
-
アクティブなジョブとそのステータスを表示します。
sleep
-
指定された時間だけ処理を遅延します。
fg
-
ジョブをフォアグラウンドに移動させます。
bg
-
ジョブをバックグラウンドに移動させます。
kill
-
ジョブにシグナルを送信します。
nohup
-
セッション/端末からジョブを切り離します。
exit
-
現在のシェルを終了します。
tail
-
ファイルの最新の行(最後の行)を表示します。
watch
-
コマンドを繰り返し実行します(デフォルトでは2秒ごと)。
uptime
-
システムの稼働時間、現在のユーザー数、システムのロードアベレージを表示します。
free
-
メモリ使用量を表示します。
pgrep
-
名前からプロセスIDを検索します。
pidof
-
名前からプロセスIDを検索します。
pkill
-
名前を指定してプロセスにシグナルを送信します。
killall
-
名前を指定してプロセスを強制終了させます。
top
-
プロセス状態を動的に表示します。
ps
-
現在のプロセス状態を取得して表示します。
演習の解答
-
oneko
は、猫がマウスカーソルを追いかける面白いプログラムです。自分のデスクトップシステムにまだインストールされていない場合は、ディストリビューションのパッケージマネージャーを使用してインストールしてください。以下の演習ではこれを使ってジョブ制御を学びます。-
どうやってプログラムを起動しますか?
端末に
oneko
と入力します。 -
マウスカーソルを動かして、猫がどのように追いかけるかを見てみましょう。次に、プロセスを停止します。どうやってプロセスを停止しますか? 出力内容はどうなりますか?
Ctrl+z
を押します。[1]+ Stopped oneko
-
ジョブの数を確認してください。何を入力しますか? 出力内容はどうなりますか?
$ jobs [1]+ Stopped oneko
-
ジョブIDを指定して先ほど確認したジョブをバックグラウンドに送ります。出力内容はどうなりますか? ジョブがバックグラウンドで実行されていることを確認するにはどうしますか?
$ bg %1 [1]+ oneko &
猫がまた動き出すことから、ジョブが実行されていることを確認できます。
-
最後に、ジョブIDを指定してジョブを終了させます。何を入力しますか?
$ kill %1
-
-
Apache HTTPD Webサーバー(
apache2
)によって生成されたすべてのプロセスのPIDを、2通りのコマンドで調べてください。$ pgrep apache2
または
$ pidof apache2
-
PIDを使用せずに、すべての
apache2
プロセスを終了させる2種類のコマンドはどうなりますか?$ pkill apache2
または
$ killall apache2
-
apache2
のすべてのインスタンスを終了する必要があるのですが、それらのPIDを調べるのは面倒です。ワンライナー(1行のコマンド)として、killでSIGTERMを送信するにはどうしますか?$ kill $(pgrep apache2) $ kill `pgrep apache2`
または
$ kill $(pidof apache2) $ kill `pidof apache2`
NoteSIGTERM
(15
)はデフォルトのシグナルであるため、kill
にオプションを渡す必要はありません。 -
top
を起動し、対話的に以下を実行してください。-
プロセスをツリー状に表示してください。
V
を押します。 -
ユーザー空間とカーネル空間を区別し、プロセスのフルパスを表示してください。
c
を押します。
-
-
ps
コマンドで、Apache HTTPD Webサーバー の所有者(www-data
)が起動したすべてのプロセスを表示してください。-
BSDスタイルを使用する場合。
$ ps U www-data
-
UNIXスタイルを使用する場合。
$ ps -u www-data
-
GNUスタイルを使用する場合。
$ ps --user www-data
-
発展演習の解答
-
デーモンを再起動するために、
SIGHUP
を送信することがあります。Apache HTTPD Webサーバー を例に取ってみましょう。SIGHUP
を親プロセス(init
ないしsystemd
が起動したプロセス)に送信すると、その子プロセスが強制終了されます。さらに、親プロセスは設定ファイルを再読込して、ログファイルを再度開き、新しい子プロセスを生成します。以下の課題に取り組んでみましょう。-
Webサーバーを起動します。
$ sudo systemctl start apache2
-
親プロセスのPIDを確認してください。
$ ps aux | grep apache2
親プロセスは、
root
ユーザーによって開始されたプロセスです(所有者がroot、親のPID(PPID)が1(initないしsystemd)になっています)。筆者が実行した環境では、PIDが1653
のものでした。 -
親プロセスに
SIGHUP
を送信してApache HTTPD Webサーバーを再起動します。$ kill -SIGHUP 1653
-
親プロセスは再起動していないこと、および新しい子プロセスが生成されていることを確認してください。
$ ps aux | grep apache2
親の
apache2
プロセスといくつかの新しい子プロセスが表示されるはずです。
-
-
ps
はある時点の状態を静的に表示をするコマンドですが、watch
と組み合わせれば、時間による変化を動的に 追いかける ことができます。 Apache HTTPD webサーバー で新しい接続を監視してみましょう。以下で説明するタスクを実行する前に、https://httpd.apache.org/docs/current/mod/mpm_common.html[Apache MPM Common Directives] のMaxConnectionsPerChild
ディレクティブの説明を読むことをお勧めします。-
apache2
の設定ファイルで、MaxConnectionsPerChild
ディレクティブの値を1
にセットします。 - Debian 系では/etc/apache2/apache2.conf
; CentOS 系は/etc/httpd/conf/httpd.conf
が設定ファイルです。設定ファイルの変更を有効にするには、apache2
を再起動することを忘れないでください。設定ファイルに追加する行は
MaxConnectionsPerChild 1
です。sudo systemctl restart apache2
を実行すると、Webサーバー(apache2
)を再起動できます。 -
apache2
接続を監視するためにwatch
、ps
、grep
を使うコマンドを入力します。$ watch 'ps aux | grep apache2'
または
$ watch "ps aux | grep apache2"
-
ここで、Webブラウザーを開くか、
lynx
などのコマンドラインブラウザーを使用して、IPアドレスでWebサーバーに接続します。watch
の出力結果から何がわかりますか?www-data
が所有する子プロセスの1つが消えます。
-
-
このレッスンで学習したように、
top
はデフォルトでCPU使用率の降順に(最も大きな値が一番上になるように)タスクをソートします。この表示順序は、対話型キーである、M
(メモリ使用量)、N
(プロセスID)、T
(実行時間)、P
(CPU使用率)で変更できます。-o
オプションを指定してtop
を起動すると、タスクリストをもっと細かく好みに合わせて並べ替えることもできます(詳細については、topのman
ページを確認してください)。以下でやってみましょう。-
top
を起動して、タスクがメモリ使用量でソートされるようにしてください。$ top -o %MEM
-
メモリ列を強調表示して、正しいコマンドを入力したことを確認してください。
x
を押します。
-
-
ps
にも、表示する列を指定するためのo
オプションがあります。このオプションを調べて、以下を実行してみてください。-
ユーザー、メモリ使用率、CPU使用率、フルコマンド だけが表示されるように、
ps
を起動してください。$ ps o user,%mem,%cpu,cmd
-
ユーザーとコマンド名だけが表示されるように、
ps
を起動してください。$ ps o user,comm
-