助け合いフォーラム

LPIC

LPIC Lv1-101(Ver5.0)
問題ID : 3478
問題を開く
「mycommand」コマンドのみを実行している全てのプロセスに、終了を要求するシグナル(SIGTERM)を送りたい。適切なコマンドは次のうちどれか。(2つ選択)

正解

killall -SIGTERM mycommand

killall -s 15 mycommand

解説

シグナルは、プロセスに終了などを通知する仕組みです。
killコマンドがプロセスID(PID)を指定するのに対し、killallコマンドはプロセス名(コマンド名)を指定します。同じコマンドを実行している全てのプロセスへシグナルを送るには、killallコマンドを利用します。

killallコマンドの書式と主なシグナル名およびシグナル番号は以下のとおりです。

killall [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
killall -s シグナル名またはシグナル番号 プロセス名(コマンド名)



シグナルSIGTERMを送信するには、-sオプションまたは「-」に続けて、シグナル名「SIGTERM」かシグナル番号「15」を指定します。

したがって、正解は
・killall -SIGTERM mycommand
・killall -s 15 mycommand
です。

正解の2つを含め、以下のコマンドは全て同じ動作をします。

・killall mycommand
・killall -15 mycommand
・killall -TERM mycommand
・killall -SIGTERM mycommand
・killall -s 15 mycommand
・killall -s TERM mycommand
・killall -s SIGTERM mycommand

SIGTERMを受けたプログラムは、終了前にファイルを閉じるなどの後始末(クリーンアップ)を行えます。実際に行うかどうかは、プログラムの処理によります。

その他の選択肢については、以下のとおりです。
・killall -T mycommand
killallに-Tというオプションはありません。

・kill mycommand
killはPIDやジョブ番号を指定します。コマンド名は指定できません。

・kill -15 mycommand
15はSIGTERMですが、killにはPIDやジョブ番号を指定するため、コマンド名の指定は誤りです。

参考

【プロセスの検索】
プロセスとは、システム上で動作しているプログラムの最小単位のことです。psコマンドは実行中のプロセスを一覧表示します。PID(プロセスID)やプロセス名(コマンド名)を確認できます。


また、pgrepコマンドで実行中のプロセスから特定の名前を持つプロセスIDを検索することができます。
pgrepコマンドの書式は以下のとおりです。

pgrep [オプション] 検索パターン

実行例:


検索パターンには、複数の文字列を記号で表す拡張正規表現が指定できます。以下の(as|ss)hは、ashまたはsshに一致します。-lオプションを使うと、検索パターンにマッチしたプロセス名も表示されます。


■ユーザーを指定して検索
特定のユーザーが実行したプロセスや、特定の権限で動作するプロセスも検索できます。
-Uオプションは実ユーザーで、-uオプションは実効ユーザーで検索します。実ユーザーはプロセスを起動したユーザー、実効ユーザーはプロセスの権限の判定に使われるユーザーです。
指定にはユーザー名のほか、実ユーザーの識別番号(UID)や実効ユーザーの識別番号(EUID)も使えます。

以下は、sudoで別のユーザーとして実行する例と、SUID(実行ファイルの所有者の権限で動作させる設定)によって実効ユーザーが変わる例です。


【シグナルによるプロセスの制御】
psやpgrepで調べたPIDは、killコマンドの送信先に指定できます。
kill、killall、pkillコマンドで、プロセスに終了や一時停止などを通知するシグナルを送ることができます。kill、killall、pkillコマンドの書式と主なシグナル名およびシグナル番号は以下のとおりです。

■kill:PIDで指定
kill [-シグナル名または-シグナル番号] プロセスID
または
kill -s シグナル名またはシグナル番号 プロセスID

■killall:プロセス名で指定
killall [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
killall -s シグナル名またはシグナル番号 プロセス名(コマンド名)

■pkill:プロセス名のパターンで指定
pkill [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
pkill --signal シグナル名またはシグナル番号 プロセス名(コマンド名)

kill・killallの-sとpkillの--signalは、シグナルを指定するオプションです。その後のシグナル名・番号にはハイフンを付けません。例えば、pkill -TERM mycommandとpkill --signal TERM mycommandは同じ動作です。
シグナルを指定しない場合は、kill、killall、pkillのいずれもSIGTERM(15)を送ります。


killコマンドはプロセスID(PID)を指定してシグナルを送ります。PIDは複数指定できます。
killallコマンドはプロセス名(コマンド名)を使用して、同じプロセス名の全てのプロセスに対してシグナルを送ります。

例) kill -SIGHUP 1133
例) killall -SIGHUP mycommand

また、pkillコマンドでは、プロセス名を拡張正規表現で指定できます。killallコマンドでも、-rオプションを付けると同様に指定できます。

例) killall -r 'mycommand[23]'

例)


■ジョブ番号で指定
また、killコマンドはジョブ番号を指定し、ジョブにシグナルを送ることもできます。ジョブ番号は「%ジョブ番号」と指定します。

例) kill %2

ジョブ番号はjobsコマンドで確認することができます。先頭の[ ]内の数値がジョブ番号です。
上に戻る

問題文が誤解を招く表現なので直してほしい

投稿日 2024/04/06

問題文が「mycommand」コマンドを実行している全てのプロセスをクリーンアップして終了させたい。
となっていますが

「mycommand」コマンドのみを実行している全てのプロセスをクリーンアップして終了させたい。
と変えたほうが個人的にはpkill mycommandが間違いだと分かりやすくていいと思います。

この問題文だと人によって捉え方が違ってしまうと思います。

解説の方は
pkill mycommandが正しくない理由がちゃんと述べられていて問題ないです。


u uri160

2024/04/06 11:58

あるいは ただし、「mycommand2」などは終了させたくない といった文面を後に加えるのもいいと思います。

2024/04/09 10:37

Linuxシステムの管理において、基本的にはより安全で確実な方法を選ぶべきだと思われます。予期せぬプロセスを誤って終了させてしまうリスクは避けるべきで、コマンド名が似ているだけのプロセスまで終了させてしまうのは危険です。
pkillを選びたくなる気持ちも少しわかるのですが、ユーザが作成したコマンドであろう「mycommand」の他に似た名前のコマンドがあるとは示されていませんし、そういったコマンドがあったとしても処理内容が全く異なる可能性がありますので、不明なコマンドをまとめて止めることは推奨されないと思います。

この問題の意図は、killallの機能詳細や「killall -SIGTERM」と「killall -s 15」が同じ機能をもつことの学習と推測されます。
(正答できない=学習が完了していない=まだ受験すると危ない
 ※教材の問題は、一発正答するためのものではなく「解説内容のポイントを理解・記憶できるようになったら正答でき、受験時の得点も増える」繰り返し使うツール)

正答数が2つと明示されており、pkillの選択肢は1つのみですので、もう一つが存在せず選べない=誤答を選んだまま進んで失点にはならない、はず…
選択肢全てをざっと見る習慣も学習時・受験時ともに役立つと思います。


コメント

u uri160

2024/04/16 13:01

ご回答ありがとうございます。 選択肢が2つという表現 や pkillが選んではいけないとなんとなく察する というのは分かるので答え自体は分かる問題なのですが 個人的には問題文をそれでも修正してほしいと感じますね。 なぜなら過去の類似質問からするとこの問題文に対する回答は 元々はpkillを含めた3つが正解となっていたそうで 過去に他の方がpkillは誤っているのではと指摘をされてから直されています。 そして変更後は解説はpkillの説明を追記して丁寧に修正したようには感じられますが、問題文の内容の方は選択肢の数を3つから2つに変更したのみで、他は変更しておらず不自然なままだからです。 pingtでの解き方としては本番で選択肢の数を指定されない複数選択の問題が出た時を想定して、あえて選択肢の数までは読まずに解く方も多いと思いますのでそういった方にも考慮して直してほしいと思っています。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?