InfraAcademy

InfraAcademy Blog

kill -9はいつ使う?LPIC-1のプロセス管理(ps・kill・ジョブ制御・nice)を練習問題8問で整理する

著者: ryu | #Linux #LPIC #LPIC-1
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

この記事を共有

こんにちは、インフラエンジニアのryuです。

今回は、LPIC-1の101試験で出題されるプロセス管理を、練習問題で確かめていきます。

ps や kill は、Linuxを触っていれば一度は打ったことがあるコマンドだと思います。ただ、試験ではシグナルの番号や、ジョブを止めたあとの再開のしかた、nice値の範囲など、普段は意識しない細かいところまで聞かれます。

この記事では、まず出題範囲と覚えておきたいポイントを整理し、そのあとで練習問題8問を解いてもらいます。問題を解く前に、記事の途中で紹介するコマンドを手元で打っておくと、答えの根拠がはっきりします。

LPIC-1のプロセス管理はどこで出題される?

最初に、出題範囲を確認しておきましょう。

プロセス管理は、LPIC-1の101試験(101-500)の主題103「GNUとUnixのコマンド」に含まれています。関係する項目は次の2つです。

項目 内容 重み
103.5 プロセスを生成、監視、終了する 4
103.6 プロセスの実行優先度を変更する 2

103.5では、ps、top、kill、killall、pgrep、pkill、jobs、fg、bg、nohup、&、watch、screen、tmux などが対象です。103.6では、nice、renice、ps、top が対象になっています。

2つを合わせると重みは6あるので、101試験の中でも出題数が多い分野です。コマンドの種類が多いので、1つずつ何をするコマンドなのかを言えるようにしておきましょう。

psの出力は、どこを見ればいい?

プロセスを確認するときにまず使うのが ps です。

よく使う書き方は ps aux と ps -ef の2つです。どちらも全プロセスを表示しますが、表示される列が違います。

ps aux | head -5     # BSD形式。CPU使用率やメモリ使用率、状態(STAT)が見える
ps -ef | head -5     # UNIX形式。親プロセスのID(PPID)が見える
ps -o pid,ni,comm    # 表示する列を自分で指定する

ps aux の見出しは USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND です。ps -ef の見出しは UID PID PPID C STIME TTY TIME CMD になります。

試験でよく聞かれるのは、STAT 列の文字の意味です。主なものを表にまとめます。

STATの文字 意味
R 実行中、または実行可能
S 割り込み可能なスリープ(何かを待っている)
D 割り込み不可能なスリープ(主にI/Oの完了待ち)
T 停止中(ジョブ制御などで止められている)
Z ゾンビ(終了したが、親プロセスに回収されていない)

D の状態のプロセスが多いと、CPUが空いているのにロードアベレージが高くなることがあります。このあたりはLinuxのload averageの読み方で詳しく解説しています。

ps のオプションをもっと知りたい人は、psコマンドの使い方もあわせて読んでみてください。

killとシグナルの番号を整理しよう

次に、プロセスを止めるときに使う kill です。

kill という名前ですが、このコマンドがしているのは、プロセスにシグナルを送ることです。どのシグナルを送るかによって、プロセスの動きが変わります。

kill はシグナルを指定しないと SIGTERM(15番)を送ります。SIGTERM はプロセスに終了を依頼するシグナルで、プロセス側で後片付けをしてから終了できます。

試験に出やすいシグナルを表にまとめます。番号は、x86やARMのLinuxで使われている値です。

シグナル 番号 主な意味・送られる場面
SIGHUP 1 端末の切断。デーモンでは設定の再読み込みに使うことが多い
SIGINT 2 割り込み。端末で Ctrl+C を押したときに送られる
SIGKILL 9 強制終了。プロセス側で受け取って処理することも、無視することもできない
SIGTERM 15 終了の依頼。kill の既定のシグナル
SIGCONT 18 停止しているプロセスを再開する
SIGSTOP 19 停止。SIGKILLと同じく、受け取って処理することも無視することもできない
SIGTSTP 20 端末からの停止。Ctrl+Z を押したときに送られる

kill -9(SIGKILL)は、SIGTERMで止まらないときの最後の手段と考えておきましょう。SIGKILLを受けたプロセスは後片付けができないので、一時ファイルが残ったり、書きかけのデータが壊れたりすることがあります。

シグナルの番号と名前は、kill -l で一覧を表示できます。kill -l 9 のように番号を付けると、その番号のシグナル名が表示されます。

プロセスIDではなく名前で止めたいときは、killall や pkill を使います。killall はコマンド名が一致するプロセスに、pkill はパターンに一致するプロセスにシグナルを送ります。名前からプロセスIDを探すだけなら pgrep です。

kill コマンドの基本は、killコマンドの使い方にもまとめています。

ジョブ制御(&・jobs・fg・bg)の動きを確かめよう

ここからは、ジョブ制御です。文章で読むより、実際に打って動きを見たほうが早く覚えられます。

ジョブとは、シェルから起動したコマンドの単位のことです。コマンドの末尾に & を付けると、バックグラウンドのジョブとして起動できます。

今日やる練習:ジョブを止めて、再開して、終了させる

次のコマンドを1行ずつ打って、jobs の表示がどう変わるかを見てください。sleep は指定した秒数だけ待つコマンドなので、試しても何も壊れません。

sleep 300 &          # バックグラウンドでジョブ1を起動する
sleep 600            # フォアグラウンドで起動する(ここで Ctrl+Z を押す)
jobs                 # ジョブ1が実行中、ジョブ2が停止中になっていることを確認する
bg %2                # 停止中のジョブ2をバックグラウンドで再開する
jobs                 # ジョブ2も実行中になったことを確認する
fg %1                # ジョブ1をフォアグラウンドに戻す(ここで Ctrl+C を押して終了する)
kill %2              # ジョブ2にSIGTERMを送って終了させる
jobs                 # ジョブが残っていないことを確認する

ポイントは、Ctrl+Z で止めたジョブは終了したわけではなく、停止しているだけという点です。停止中のジョブは、bg でバックグラウンド、fg でフォアグラウンドに戻して再開できます。

%1 や %2 は、ジョブ番号でジョブを指定する書き方です。kill にはプロセスIDだけでなく、このジョブ番号も指定できます。

ログアウトしても処理を続けたいとき

もう1つ覚えておきたいのが、ログアウトしたあとの動きです。

端末を閉じると、そこから起動したジョブにはSIGHUPが送られ、多くの場合は終了してしまいます。時間のかかる処理をログアウト後も続けたいときは、nohup を付けて起動します。

nohup sleep 600 &    # SIGHUPを無視させて起動する。出力は nohup.out に書かれる

作業そのものを切断後も続けたいときは、screen や tmux で端末のセッションを残しておく方法もあります。

niceとreniceで、実行優先度を変える

最後に、103.6の実行優先度です。

Linuxでは、プロセスの優先度をnice値で調整できます。nice値の範囲は -20 から 19 で、数字が小さいほど優先度が高く、大きいほど優先度が低くなります。

操作 コマンドの例 一般ユーザー
既定の値で起動する sleep 100 & nice値は親から引き継ぐ(通常は0)
-n を付けずにniceで起動する nice sleep 100 & nice値が10上がる
優先度を下げて起動する nice -n 15 sleep 100 & できる
優先度を上げて起動する nice -n -5 sleep 100 & できない(rootが必要)
実行中のプロセスの値を変える renice -n 5 -p <PID> 値を上げる方向だけできる

一般ユーザーができるのは、nice値を上げる、つまり優先度を下げる方向だけです。優先度を上げる方向の変更にはroot権限が必要です。

値は ps で確認できます。次のコマンドで、起動したプロセスのnice値を見てみてください。

nice sleep 100 &             # -n を付けずに起動する
ps -o pid,ni,comm -p $!      # 直前に起動したプロセスのnice値(NI列)を表示する
renice -n 15 -p $!           # nice値を15に変える(上げる方向なので一般ユーザーでもできる)

$! は、直前にバックグラウンドで起動したプロセスのIDが入る変数です。NI 列の値が、起動時と renice のあとでどう変わるかを確認してください。

LPIC-1のプロセス管理の練習問題8問

ここまでの内容を、練習問題で確かめましょう。問題はすべてオリジナルです。答えを選んだら、すぐ下の解説を読んで、ほかの選択肢がなぜ違うのかも確認してください。

問題1:killの既定のシグナル

シグナルを指定せずに kill 1234 を実行したとき、PID 1234 のプロセスに送られるシグナルはどれですか。

  • A. SIGHUP
  • B. SIGINT
  • C. SIGKILL
  • D. SIGTERM

正解:D シグナルを指定しない kill はSIGTERM(15番)を送ります。SIGHUPは1番、SIGINTは2番、SIGKILLは9番です。

問題2:無視できないシグナル

プロセス側で受け取って処理することも、無視することもできないシグナルはどれですか。

  • A. SIGHUP
  • B. SIGINT
  • C. SIGKILL
  • D. SIGTERM

正解:C SIGKILL(9番)とSIGSTOP(19番)は、プロセス側で処理や無視ができません。SIGHUP・SIGINT・SIGTERMは、プロセス側でハンドラを設定して処理を変えたり、無視したりできます。

問題3:停止したジョブの再開

フォアグラウンドで実行中のコマンドを Ctrl+Z で停止しました。このジョブを、バックグラウンドで実行を再開させるコマンドはどれですか。

  • A. bg
  • B. fg
  • C. jobs
  • D. nohup

正解:A bg は停止中のジョブをバックグラウンドで再開します。fg はフォアグラウンドに戻すコマンド、jobs はジョブの一覧を表示するコマンドです。nohup はSIGHUPを無視させてコマンドを起動するもので、停止中のジョブの再開には使いません。

問題4:ゾンビプロセス

ps aux の STAT 列に Z と表示されているプロセスの状態として、正しいものはどれですか。

  • A. 割り込み不可能なスリープ中
  • B. 停止中
  • C. 実行中
  • D. 終了したが、親プロセスに回収されていない

正解:D Z はゾンビ状態です。割り込み不可能なスリープは D、停止中は T、実行中または実行可能は R で表示されます。

問題5:名前でプロセスを終了する

httpd という名前のプロセスがいくつも動いています。プロセスIDを調べずに、名前を指定してまとめてシグナルを送れるコマンドはどれですか。

  • A. kill httpd
  • B. killall httpd
  • C. pgrep httpd
  • D. nohup httpd

正解:B killall は、コマンド名が一致するプロセスにシグナルを送ります。kill はプロセスIDかジョブ番号で対象を指定するので、名前だけでは使えません。pgrep はプロセスIDを表示するだけで、シグナルは送りません。

問題6:nice値の既定の増分

-n を付けずに nice backup.sh を実行しました。nice値0のシェルから実行した場合、backup.sh のnice値はいくつになりますか。

  • A. -10
  • B. 0
  • C. 10
  • D. 19

正解:C nice は -n を省略すると、nice値を10増やしてコマンドを起動します。nice値0のシェルから起動すると10になります。

問題7:一般ユーザーにできない操作

一般ユーザーが実行したとき、権限が足りずに失敗するものはどれですか。なお、どのコマンドも自分のプロセスに対して実行するものとし、nice値0のシェルから実行します。

  • A. nice -n 5 sleep 100
  • B. nice -n 19 sleep 100
  • C. nice -n -5 sleep 100
  • D. sleep 100 & で起動したプロセスに renice -n 10 -p <PID>

正解:C nice値を下げる(優先度を上げる)操作にはroot権限が必要です。A・B・Dは、どれもnice値を上げる(優先度を下げる)方向の操作なので、一般ユーザーでも実行できます。

問題8:ログアウト後も処理を続ける

時間のかかるスクリプトを実行したまま、端末からログアウトしたいと考えています。端末の切断で送られるシグナルを無視させて、スクリプトを起動するコマンドはどれですか。

  • A. nohup
  • B. nice
  • C. jobs
  • D. fg

正解:A nohup はSIGHUPを無視させてコマンドを起動します。nice は優先度を変えて起動するコマンド、jobs はジョブの一覧、fg はジョブをフォアグラウンドに戻すコマンドです。

8問のうち、何問正解できたでしょうか。迷った問題があれば、その問題に出てきたコマンドを手元で打って、結果を確かめてみてください。

InfraAcademyで、プロセス管理の練習を続ける

プロセス管理は、問題を解くだけより、実際にジョブを止めたり再開したりしたほうが確実に身につきます。

InfraAcademyでは、ブラウザ上で動くLinuxの練習環境で、この記事の sleep や jobs、nice のコマンドをそのまま試せます。自分のPCにLinuxを用意しなくても大丈夫です。

問題演習は、トップページのInfraAcademy の資格模擬問題から「(無料)LPICの練習問題で毎日トレーニング300問」を解いてみてください。間違えた問題は、選択肢に出てきたコマンドを練習環境で打って確かめると、次に同じ主題が出たときに迷いにくくなります。

ほかの範囲も手を動かして確かめたい人は、LPIC-1のハンズオン課題に進んでみてください。学ぶ順番はLinuxの学習ロードマップ、LPICの勉強全体の進め方はLPICの勉強方法にまとめています。

11月中に受験を考えている人は、LPIの無料再受験キャンペーンの条件も確認しておくとよいと思います。

まとめ

LPIC-1のプロセス管理で押さえておきたいポイントを振り返ります。

  • 出題範囲は101試験の103.5(重み4)と103.6(重み2)
  • ps aux の STAT 列は、R・S・D・T・Zの意味を言えるようにする
  • kill の既定はSIGTERM(15番)。SIGKILL(9番)は処理も無視もできない最後の手段
  • Ctrl+Z は停止で、bg と fg で再開できる。ログアウト後も続けるなら nohup
  • nice値は -20 から 19。一般ユーザーは値を上げる方向だけ変更できる

コマンドの数は多いですが、どれも実際に打てばすぐに動きが分かるものばかりです。今日の練習を一度やっておけば、試験の問題文を読んだときに画面の動きが思い浮かぶようになりますよ。

参考

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

株式会社InfraAcademy 代表 / エンジニア

大手メーカーでインフラエンジニアとして勤務した後、ベンチャー企業・スタートアップでフルスタックエンジニアを経験。その後、起業し学習サービス「InfraAcademy」を運営しています。
保有資格:ネットワークスペシャリストなど 運営会社:株式会社InfraAcademy

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る