「kill」コマンドを実行した際、オプション/PIDのような数字をセットで実行する場面に遭遇しました。
この記事にてその数字の正体についてまとめたいと思います。
killコマンドとは
killコマンドは、プロセスに対して「シグナル」というOSレベルの通知を送るコマンドです。
「プロセスを killする」という語感からも、「kill=止める・消失させる」といったイメージがあります。
kill コマンドは、実行中のプロセスにシグナル (デフォルトでは SIGTERM シグナル) を送信します。 このコマンドのデフォルトのアクションは、プロセスの通常停止です。 プロセスを停止したい場合は、ProcessID 変数にプロセス ID (PID) を指定します。
『kill コマンド』 --by IBM
シグナルとは
シグナルとは、(通常はソフトウェアによる)割り込みの一種で、プロセスに非同期イベントを通知するために使用されます。
『Linuxシグナル』 --by Northern Illinois University
シグナルとは、何らかの状況に反応してLinuxシステムから生成されるイベントのことです。シグナルは、カーネルからプロセスに、プロセスから別のプロセスに、あるいはプロセスからそのプロセス自体に送信されます。シグナルを受け取ったプロセスが、アクションを実行する場合もあります。
"Signals in prod: dangers and pitfalls" --by Meta
英語でも「シグナル」は「信号・合図」という意味を持つように、コマンドにおいてもプロセスとしての意味を伝えるための存在になっています。
「シグナル」とは、killコマンドの後ろのオプションのポジション部分に記載されますが、すべてのCPUにおいて同じではなく、OSによって若干差異があるようでした。
LDP_man-pagesのサイトには、x86(インテル系CPU), Alpha(かつてのCPU),Parisc(HP系のかつてのCPU)が区別されて表になっていたので、参考にさせていただきました。
| Signal | x86/ARM/他多数 | Alpha/SPARC | MIPS | PARISC | Notes |
|---|---|---|---|---|---|
| SIGHUP | 1 | 1 | 1 | 1 | 制御端末の切断(ハングアップ)、仮想端末の終了 |
| SIGINT | 2 | 2 | 2 | 2 | keybordからの割り込み(Ctrl+C) |
| SIGQUIT | 3 | 3 | 3 | 3 | keybordからの中止(Ctrl+\) |
| SIGILL | 4 | 4 | 4 | 4 | 不正命令(トラップされた場合、リセットされない) |
| SIGTRAP | 5 | 5 | 5 | 5 | トレース/ブレークポイント(デバッガ用) |
| SIGABRT | 6 | 6 | 6 | 6 | abort(3) による異常終了 |
| SIGIOT | 6 | 6 | 6 | 6 | SIGABRTと同義(歴史的理由) |
| SIGBUS | 7 | 10 | 10 | 10 | バスエラー(プログラミングエラー、またはシステム上のデバイス損傷によって発生すルエラ―) |
| SIGEMT | - | 7 | 7 | - | エミュレーショントラップ(歴史的) |
| SIGFPE | 8 | 8 | 8 | 8 | 浮動小数点例外、ゼロ除算 |
| SIGKILL | 9 | 9 | 9 | 9 | 強制終了(捕捉不可) |
| SIGUSR1 | 10 | 30 | 16 | 16 | ユーザー定義1 |
| SIGSEGV | 11 | 11 | 11 | 11 | セグメンテーション違反 |
| SIGUSR2 | 12 | 31 | 17 | 17 | ユーザー定義2 |
| SIGPIPE | 13 | 13 | 13 | 13 | パイプ切断(書き込み先なし) |
| SIGALRM | 14 | 14 | 14 | 14 | アラーム(タイマー満了) |
| SIGTERM | 15 | 15 | 15 | 15 | kill()からの終了要求シグナル |
| SIGSTKFLT | 16 | - | - | 7 | 数値例外(古いFPU関連。ほぼ未使用) |
| SIGCHLD | 17 | 20 | 18 | 18 | 子プロセス終了通知 |
| SIGCLD | - | - | 18 | - | SIGCHLDと同義(歴史的互換) |
| SIGCONT | 18 | 19 | 25 | 26 | 停止中プロセスの再開 |
| SIGSTOP | 19 | 17 | 23 | 24 | 強制停止(捕捉不可) |
| SIGTSTP | 20 | 18 | 24 | 25 | 端末からの停止(Ctrl+Z) |
| SIGTTIN | 21 | 21 | 26 | 27 | バックグラウンドプロセスの読み込み試行 |
| SIGTTOU | 22 | 22 | 27 | 28 | バックグラウンドプロセスの書き込み試行 |
| SIGURG | 23 | 16 | 21 | 29 | ソケットの緊急データ到着 |
| SIGXCPU | 24 | 24 | 30 | 12 | CPU時間制限超過 |
| SIGXFSZ | 25 | 25 | 31 | 30 | ファイルサイズ制限超過 |
| SIGVTALRM | 26 | 26 | 28 | 20 | 仮想タイマー満了 |
| SIGPROF | 27 | 27 | 29 | 21 | プロファイリングタイマー満了 |
| SIGWINCH | 28 | 28 | 20 | 23 | ウィンドウサイズ変更 |
| SIGIO | 29 | 23 | 22 | 22 | 非同期I/O通知 |
| SIGPOLL | SIGIO と同義 | ||||
| SIGPWR | 30 | 29/- | 19 | 19 | 電源障害(UPS連携など) |
| SIGINFO | - | 29/- | - | - | ステータス要求(BSD系の名残) |
| SIGLOST | - | -/29 | - | - | ファイルロック喪失(歴史的。実質未使用) |
| SIGSYS | 31 | 12 | 12 | 31 | 不正なシステムコール |
| SIGUNUSED | 31 | - | - | 31 | 旧称。いまは SIGSYS に統合済み |
参考にさせていただいたリンク
- "SIGNAL" --by Linux Programmer's Manual (7)
- 『Linuxの「シグナル」って何だろう?』 --by ITmedia
- 『シグナル (イベント)』 --by 通信用語の基礎知識
CPUについての参考
-
x86:
-
Alpha:
-
PA-RISC:
「オプション」?「シグナル」? 〜後ろにつける非PIDの謎の数字の正体〜
下記の「使用例」のように kill -9 1924というコマンドを初見で見た時、「-9」が通常見かけるような「オプション」とは思えませんでした。
使用例
kill -9 1924
『プロセスの表示/操作:プロセスの終了』 --by FUJITSU 技術情報 Technical Park
Linuxのオプションには ls -a find . -name 等、かろうじて意味を持たされていることがわかるものを目にすることが多いと思います。
そして、このkillコマンドkill -9 1924の後ろの意味がなさそうな数字「-9」は前述の表に記載した「シグナル」という存在だったのでした。
kill -9 1924は「PID 1924のプロセスに9番のシグナル(SIGKILL)を送る」という意味になります。
感想
killコマンドで使用するシグナルは限られてくると思いますし、「オプションもシグナルも使えれば名前など問題ない」ということは承知の上なのですが、CPUの制御とも深く関わりのある「シグナル」という存在を知り、オプションのように操作ができることに感銘を受けました。
普段使っている「ctrl + c」なども、シグナルによる制御だったことを知って感慨深くなりました。
killコマンドの用例というよりは、ほぼ「シグナル」の概要になってしまいましたが、「killコマンドはオプションやシグナルで制御・操作できる!」ということも認識できたので、ヨシ!
参考にさせていただいた記事
