助け合いフォーラム
正解
killまたはkillallコマンドでINT(SIGINT)シグナルを送信する
Ctrl+cキーを押下する
解説
以下は主なシグナル名およびシグナル番号をまとめたものです。
上表より、割り込みシグナルはINT(SIGINT)です。Ctrl+cキーを押下することでもINT(SIGINT)シグナルを送ることができます。
したがって正解は
・killまたはkillallコマンドでINT(SIGINT)シグナルを送信する
・Ctrl+cキーを押下する
です。
コマンドをシェル上で実行すると、通常フォアグラウンドで実行されます。フォアグラウンドでコマンドを実行すると、そのコマンドが終了するまで別のコマンドを実行することができません。
誤って処理時間のかかるコマンドを実行してしまった場合などに、Ctrl+cキーを押下してそのコマンド(プロセス)を中止させます。
その他の選択肢については上表をご確認ください。
参考
また、pgrepコマンドで実行中のプロセスから特定の名前を持つプロセスIDを検索することができます。
pgrepコマンドの書式は以下のとおりです。
pgrep [ オプション ] 検索パターン
実行例:
検索パターンには拡張正規表現が指定できます。-lオプションを使うと、検索パターンにマッチしたプロセス名も表示されます。
-uオプションを使うと、特定のユーザーが実行したプロセスのみを検索対象とすることができます。
例)
kill、killall、pkillコマンドで、プロセスに終了や再起動などのシグナル(命令)を送ることができます。kill、killall、pkillコマンドの書式と主なシグナル名およびシグナル番号は以下のとおりです。
kill [-シグナル名または-シグナル番号] プロセスID
または
kill -s [シグナル名またはシグナル番号] プロセスID
killall [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
killall -s [シグナル名またはシグナル番号] プロセス名(コマンド名)
pkill [-シグナル名または-シグナル番号] プロセス名(コマンド名)
または
pkill --signal [-シグナル名または-シグナル番号] プロセス名(コマンド名)
killコマンドはプロセスID(PID)を使用して単一のプロセスにシグナルを送りますが、killallコマンドはプロセス名(コマンド名)を使用して、同じプロセス名の全てのプロセスに対してシグナルを送ります。
例) kill -SIGHUP 1133
例) killall -SIGHUP mycommand
また、pkillコマンド、もしくはkillallの-rオプションを使うことで、プロセス名を拡張正規表現で指定してシグナルを送ることができます。
例)
また、killコマンドはジョブ番号を指定し、ジョブにシグナルを送る事もできます。ジョブ番号は「%ジョブ番号」と指定します。
例) kill %2
ジョブ番号はjobsコマンドで確認することができます。先頭の[ ]内の数値がジョブ番号です。
フォアグラウンドでプロセス(ジョブ)実行中にkillやkillallコマンドは打てないのではないか
問題:
フォアグラウンドで実行しているプロセスに割り込みシグナルを送信し、プロセスを終了したい。どのようにするとよいか。(全て選択)
正解:
killまたはkillallコマンドでINT(SIGINT)シグナルを送信する
Ctrl+cキーを押下する
上記問題について二点質問があります。
Q1.問題文にフォアグラウンドで実行している「プロセス」とあるのですが、これはフォアグラウンドで実行している「ジョブ」と同じ意味でしょうか?もし異なる場合はその違いについて教えていただけないでしょうか。
(補足:フォアグラウンド、バックグラウンドはジョブについての話で、プロセスにフォアグラウンド、バックグラウンドがあるという認識はありませんでした)
Q2.(Q1のフォアグラウンドで実行しているプロセス=ジョブの場合)
フォアグラウンドでジョブ実行中はkillやkillallコマンドを打つことができないので、「Ctrl+C」を押下するしか割り込みシグナルを送信する方法は無いのではないでしょうか?killやkillallコマンドを打つ方法があるのであればご教授いただきたいです。
Q1 について、厳密に詳しくはないのですが
ジョブはプロセスの集合(シェルから見た実行単位)の認識だったので概ね同じ意味で受け取っていいのではと思います。
ターミナル上で「sleep 10」とか実行しても、フォアグラウンドのジョブ1つともいえるしプロセス1つともいえますよね。
Q2 はジョブを実行しているターミナルとは異なるターミナルからであれば、kill/killall コマンドを実行することができると思います。
コメント
この投稿に対して返信しませんか?
P Pnt353_257
2023/09/18 13:12
回答いただきありがとうございます。 あるシェルで実行中のフォアグラウンドジョブに相当するプロセスに対して、別シェルからkillやkillallコマンドで割り込みシグナルを送ることで該当ジョブを停止できるということですね。 実際に仮想環境でやってみたところ可能であることを確認できました。 ジョブ(シェルから見た実行単位)に対してシグナルを送ることのみ考えてしまっていて、別ターミナル(別シェル)を起動してプロセスにシグナルを送るという発想が出てきませんでした。だから問題文でプロセスという表現をしているのかもしれないですね。 おかげで理解が深まりました。ありがとうございました!