LASSIC Media らしくメディア
シグナルとは|プロセスに終了を伝えるOSの仕組み
サーバ上のアプリを止めようとしたら、なかなか終わらずに数十秒待たされた——インフラ運用でよくある場面です。逆に強制的に止めたら、書きかけのデータが壊れてしまったという経験もあるかもしれません。プロセスの停止をめぐるこうした挙動の裏側には、「シグナル」というOSの仕組みが関わっています。
シグナルとは、OSがプロセスに対して「終了してほしい」「中断する」といった短い通知を送り、動作を制御するための仕掛けをいいます。この考え方を押さえておくと、無停止デプロイやコンテナの停止、バッチ処理の中断といった運用の判断がしやすくなるはずです。この記事では、発注者やプロジェクトマネージャー、インフラ担当の方に向けて、シグナルの基本と実務での勘所を整理していきます。
シグナルとは何か
シグナルとは、UNIX系OSで動くプロセスに向けて、OSや別のプロセスが送る「短い通知」のことです。番号と名前を持ち、たとえば「終了してほしい」「一時停止せよ」「設定を読み直せ」といった合図を伝えます。中身のあるデータをやり取りするのではなく、あらかじめ決められた種類の合図を届ける点が特徴といえるでしょう。
身近な例では、実行中のコマンドを「Ctrl+C」で止める操作があります。このとき裏側では、割り込みを表すシグナルがプロセスへ送られています。プロセス側は、その合図を受け取って終了処理へ移るわけです。ターミナルでの何気ない操作も、シグナルのやり取りに支えられているのです。
シグナルを受け取ったプロセスの反応は、大きく三通りに分かれます。あらかじめ用意された既定の動作(多くは終了)に従うか、自前の処理を割り当てて受け止めるか、あるいは無視するかです。この「受け止め方を選べる」性質が、後述するgraceful shutdownの土台になります。
この記事のポイント
- シグナルは、プロセスへ非同期に送られる短い通知の仕組みです。
- SIGTERMやSIGKILLなど種類があり、終了や中断といった動作を促します。
- 終了要求を受けたら後片付けをしてから止まる、行儀のよい停止が大切になります。
代表的なシグナルと役割
シグナルは数多くありますが、運用でよく登場するものは限られています。とくに押さえておきたいのが、終了を促す系統のシグナルの違いです。同じ「終了」でも、プロセス側が受け止めて後始末できるものと、割り込む余地なく止められてしまうものがあります。
| シグナル | 意味・用途 | 既定の動作 | 受け止め |
|---|---|---|---|
| SIGTERM | 終了の要求(後始末の余地を与える) | 終了 | 受け止め・無視ができる |
| SIGINT | 割り込み(Ctrl+Cに対応) | 終了 | 受け止め・無視ができる |
| SIGKILL | 強制終了(後始末の余地なし) | 即座に終了 | 受け止め・無視ができない |
| SIGHUP | 端末切断。設定の再読み込みにも転用される | 終了 | 受け止めができる |
| SIGSTOP | 一時停止 | 停止 | 受け止め・無視ができない |
ここで要になるのが、SIGTERMとSIGKILLの違いです。SIGTERMは「そろそろ終わってください」という依頼であり、受け取ったプロセスは開いているファイルや接続を閉じ、書きかけのデータを保存してから終われます。一方のSIGKILLは問答無用の強制終了で、プロセスは後始末をする間もなく打ち切られます。停止のコマンドが既定でSIGTERMを送るのは、この後始末の余地を残すためなのです。
graceful shutdownの流れ
「graceful shutdown(後始末を伴う停止)」とは、プロセスにいきなり幕を引かせるのではなく、後始末の時間を与えてから終える停止のしかたをいいます。処理中のリクエストを返し終える、接続を閉じる、書きかけのデータを保存する、といった片付けを済ませてから終了させる考え方です。
典型的な流れは二段構えです。まず停止の合図としてSIGTERMが送られ、プロセスは後始末を始めます。次に、あらかじめ決めた猶予時間(たとえば数十秒)を過ぎても終わらない場合に、最後の手段としてSIGKILLで強制的に打ち切ります。多くのコンテナ実行基盤やサービス管理の仕組みは、この「まず穏やかに、駄目なら強制的に」という手順を踏むよう作られているのです。
この仕組みがあるおかげで、稼働中のサービスを止める際も、処理中の通信を途中で切らずに済みます。無停止に近いデプロイが成り立つのも、古いプロセスへSIGTERMを送り、後始末を終えてから入れ替える段取りが土台にあるからでしょう。
強制終了(SIGKILL)が招くもの
動きの止まったプロセスを片付けたいとき、つい「強制終了」に頼りたくなるものです。いわゆる「kill -9」はSIGKILLを送る操作で、受け止められないため確かに止まります。ただし、後始末を飛ばして打ち切るため、副作用が残りやすい点に注意が要ります。
たとえば、書き込みの途中だったファイルが中途半端な状態で残る、確保していた一時領域が片付かずに残る、他のプロセスと共有していた資源の解放が漏れる、といった事態が起こりえます。データを扱う処理を強制終了すると、内容の食い違いにつながる恐れもあるのです。SIGKILLはあくまで、SIGTERMで止まらないときの最後の手段と位置づけるのが穏当でしょう。
「止まらないから強制終了する」を繰り返している場合、そもそもプロセスがSIGTERMを受け止めて後始末する作りになっていない、という設計上の課題が隠れていることがあります。日常的にkill -9が必要な状況なら、停止処理の実装を見直す糸口として捉えてみる価値があります。
実務で効いてくる場面
シグナルの考え方は、システムの発注や運用の判断にも関わってきます。無停止デプロイの設計、コンテナの停止、バッチ処理の中断のいずれにも顔を出すのです。
無停止に近いデプロイ
サービスを止めずに新しい版へ入れ替えるには、古いプロセスに停止を伝えつつ、処理中のリクエストを取りこぼさない段取りが要ります。ここでSIGTERMを受けてから後始末する作りになっていれば、切り替えの瞬間に通信が途切れる事態を避けやすくなります。停止処理の実装は、無停止デプロイの成否を左右する土台のひとつといえるでしょう。
コンテナの停止と猶予時間
コンテナを止めるとき、多くの実行基盤はまずSIGTERMを送り、一定の猶予時間を過ぎるとSIGKILLへ切り替えます。この猶予が短すぎると、後始末が終わる前に強制終了され、処理中の作業が打ち切られてしまうのです。停止に時間のかかる処理を扱うなら、猶予時間の設定を運用側で見直しておくと、取りこぼしを抑えやすくなります。
バッチ処理の中断
長時間動くバッチ処理では、途中で止める必要が生じることがあります。中断の合図を受け止めて、区切りのよいところまで進めてから終える作りにしておけば、再開しやすくなります。中断への備えがないと、どこまで処理したかがわからなくなり、やり直しの手間が増えてしまうのです。
よくある誤解と勘所
シグナルまわりは直感に反する部分があり、誤解も生まれがちです。代表的なものを表に整理しました。
| よくある誤解 | 実際のところ |
|---|---|
| プロセスを止めるならkill -9が手っ取り早い | 後始末を飛ばすため、データの破損や資源の解放漏れを招きやすい。まずはSIGTERMで穏やかに止めるのが基本。 |
| SIGTERMを送ればすぐに止まる | プロセスが後始末をしてから終わるため、少し時間がかかることがある。猶予を見込んでおく。 |
| どのシグナルも受け止めて処理を変えられる | SIGKILLとSIGSTOPは受け止め・無視ができない。プログラム側で挙動を変えられない。 |
| シグナルでプロセス間のデータ受け渡しができる | シグナルは種類の決まった合図を届けるだけ。まとまったデータの受け渡しには別の仕組みを使う。 |
勘所をひとことでいえば、「まずSIGTERMで後始末の余地を与え、止まらないときだけSIGKILLに頼る。そのために停止処理を作り込んでおく」ことに尽きます。コンテナの猶予時間や、後始末の実装が抜けていないかを設計・運用の両面で押さえておくと、停止にまつわる取りこぼしを遠ざけやすくなるでしょう。
まとめ
- シグナルは、OSや他のプロセスがプロセスへ送る短い通知で、終了・中断・再読み込みなどの合図を伝える仕組みである。
- SIGTERMは後始末の余地を与える終了要求、SIGKILLは受け止められない強制終了で、両者の違いが運用の鍵になる。
- graceful shutdownは、まずSIGTERMで後始末を促し、猶予を過ぎたらSIGKILLで打ち切る二段構えで実現される。
- kill -9(SIGKILL)はデータ破損や資源の解放漏れを招きやすく、最後の手段と位置づける。
- 無停止デプロイ・コンテナ停止・バッチ中断のいずれでも、停止処理の作り込みと猶予時間の設定が要になる。
よくある質問
SIGTERMとSIGKILLはどう使い分ければよいですか。
まずはSIGTERMで止めるのが基本です。SIGTERMはプロセスに後始末の余地を与える終了要求で、開いている接続やファイルを閉じ、書きかけのデータを保存してから終われます。SIGKILLは受け止められない強制終了で、後始末を飛ばして打ち切るため、データの破損などを招きやすくなります。SIGTERMで止まらないときに限って、最後の手段としてSIGKILLを使う、という順序で考えると整理しやすいでしょう。
kill -9を日常的に使っているのですが問題ありますか。
こまめにkill -9(SIGKILL)が必要な状況は、見直しの糸口かもしれません。SIGKILLは後始末を飛ばすため、書き込み途中のデータが中途半端に残ったり、資源の解放が漏れたりする恐れがあるのです。日常的に強制終了が要るのなら、そもそもプロセスがSIGTERMを受け止めて後始末する作りになっていない可能性があります。停止処理の実装を見直すことで、強制終了に頼らずに済むようになる場合が多いといえます。
コンテナがなかなか止まらないのはなぜですか。
多くのコンテナ実行基盤は、停止時にまずSIGTERMを送り、一定の猶予時間を過ぎるとSIGKILLへ切り替えます。プロセスが後始末に時間をかけている、あるいはSIGTERMを受け止めていないと、猶予時間いっぱいまで待ってから強制終了される形になり、停止が遅く見えるのです。後始末の実装と、実行基盤の猶予時間の設定の両面を確認すると、原因の切り分けが進めやすくなります。
シグナルでプロセス間のデータのやり取りはできますか。
シグナルは、種類のあらかじめ決まった短い合図を届ける仕組みで、まとまったデータの受け渡しには向きません。「終了してほしい」「中断せよ」といった通知を伝えるのが役割です。プロセス間でデータをやり取りしたい場合は、パイプや共有メモリ、ソケットといった別の仕組み(プロセス間通信)を使います。シグナルは制御の合図、データの受け渡しは別の手段、と切り分けて捉えるとよいでしょう。
著者:テレリモ総研編集部 鈴木 亮佑
LASSICでは、国内ニアショア開発体制を活かし、無停止デプロイやコンテナ運用を見据えた設計・実装から、停止処理の作り込み、既存システムの運用改善、性能や停止まわりの切り分けまでを一貫して支援する体制です。要件定義の段階から実装、テスト、リリース後の運用・保守まで、工程を分けずに任せられる点も強みでしょう。運用の安定化にお困りの際も、ご相談いただけます。
ご不明な点はお問い合わせフォームからもご連絡いただけます。