MENU

応答しないプロセスを段階的に安全終了させる実務手順|シグナルの選び方

「プロセスが応答しない」「止めようとしても止まらない」という状況で、いきなり強制終了するとログの欠損やファイルの破損につながることがあります。Linuxではシグナルの種類と送る順序を把握しておくことで、より安全にプロセスを停止できます。

目次

まず結論:プロセス停止の基本手順

対処の流れは2ステップです。最初から強制終了(SIGKILL)に頼らず、まず穏やかな終了要求(SIGTERM)を試してください。

# ステップ1:まず穏やかに終了要求(SIGTERM、番号15)
kill -15 

# 数秒待って生存確認
sleep 5 && kill -0  2>/dev/null && echo "まだ動いています" || echo "終了しました"

# ステップ2:それでも止まらない場合のみ強制終了(SIGKILL、番号9)
kill -9 

シグナル番号を省略した kill はSIGTERMと同じ動作です。まずこれを試すのが原則です。

PIDを調べる3つの方法

シグナルを送る前に、対象プロセスのPID(プロセスID)を確認します。状況に応じて以下を使い分けてください。

# 名前で検索してPIDと実行パスを確認
pgrep -a nginx

# プロセス一覧を詳細表示して絞り込む
ps aux | grep nginx

# プロセス名からPIDのみを取得
pidof nginx

複数のPIDが返ってきた場合は、起動時刻(ps -o pid,lstart,cmd)や親プロセスのPID(PPID)で対象を絞ってから操作してください。誤ったPIDにシグナルを送ると、無関係なプロセスに影響します。

実務でよく使うシグナルの意味と使いどころ

シグナルの全一覧は kill -l で確認できます。表示される番号とシグナル名の対応は環境によって異なる場合があるため、番号ではなくシグナル名で指定するほうが安全です(例:kill -TERM )。実務で頻出する主要シグナルは以下のとおりです。

番号シグナル名意味・使いどころ
1SIGHUPハングアップ。デーモンに対しては「設定ファイルの再読み込み」として使われることが多い。プロセスを再起動させずに設定を反映したいときに利用する。
2SIGINT割り込み。キーボードの Ctrl+C と同等。インタラクティブな処理を中断するときに使う。
15SIGTERM終了要求(デフォルト)。プロセス側でシグナルをトラップして後始末処理(ファイルのフラッシュ、ロックの解放など)を済ませてから終了できる。まずこれを試す。
9SIGKILL強制終了。カーネルが直接プロセスを消すため、プロセス側でトラップ・無視できない。後始末処理が走らないため、SIGTERMが効かないときの最終手段として使う。
19SIGSTOP一時停止。プロセスを止めたまま保持したいときに使う。SIGKILLと同様トラップ不可。
18SIGCONT再開。STOPで一時停止したプロセスを再開する。

systemd管理下のサービスはsystemctlを先に使う

nginx・sshd・mysqldなどsystemdが管理するサービスを停止する場合、最初に systemctl stop を試してください。直接 kill でプロセスを終了させると、systemdが異常終了と判断して自動再起動したり、ユニットの状態が「failed」になって次回の起動に支障をきたすことがあります。

# systemd管理のサービスを正しく停止する
sudo systemctl stop nginx

# 停止後の状態を確認
systemctl status nginx

# どうしても止まらないときだけkillで対処する
sudo kill -9 $(pidof nginx)

# kill後、ユニットのエラー状態をリセットしてから再起動する
sudo systemctl reset-failed nginx
sudo systemctl start nginx

ある運用現場では、直接 kill -9 でnginxを落とした後に systemctl start nginx を実行したところ、ユニットがfailed状態のままで「Failed to start」と表示され起動できないケースがありました。systemctl reset-failed でエラー状態をクリアしてから再起動することで解決します。

プロセス名で一括停止する方法

同名プロセスが複数起動している場合は、killall または pkill でプロセス名を指定して一括操作できます。

# 送信前に対象プロセスを必ず確認する
pgrep -a nginx

# プロセス名を完全一致で指定してSIGTERMを送る(killall)
killall nginx

# コマンドライン全体に対して正規表現で絞る(pkill)
pkill -15 -f "python.*myapp"

# 強制終了する場合
killall -9 nginx

killall はプロセス名が完全一致するものすべてに影響します。本番環境では必ず pgrep -a で対象を確認してからシグナルを送るのを習慣にしてください。

陥りやすい落とし穴と対処

SIGKILLが効かないケースがある
ゾンビプロセス(ps aux でステータスが Z のもの)はプロセス本体がすでに終了しており、いかなるシグナルも受け付けません。ゾンビを消すには親プロセスを終了させる必要があります。

# ゾンビプロセスを確認する
ps aux | awk '$8 == "Z" {print}'

# 親プロセスのPIDを調べる
ps -o ppid= -p <ゾンビのPID>

# 親プロセスにSIGCHLDを送って回収を促す(効かない場合は親ごと終了)
kill -CHLD <親のPID>

SIGTERMを送った直後にSIGKILLを送らない
SIGTERMを受け取ったプロセスが後始末を完了するまでには数秒から数十秒かかることがあります。すぐにSIGKILLを送ると後始末処理が強制中断されるため、少なくとも5〜10秒は待ってから状況を判断してください。

権限不足でシグナルが届かない
他のユーザーが所有するプロセスにシグナルを送ると「Operation not permitted」エラーになります。該当するユーザーで実行するか、sudo を使ってください。なお、kill -9 1 はPID 1(systemd)への操作であり、コンテナ環境ではシステム全体の停止につながるため絶対に実行しないでください。

<PR>この記事に関連するおすすめ書籍

[試して理解]Linuxのしくみ 増補改訂版

プロセス・ファイルシステム・権限などLinuxの内部構造を図解で理解できる一冊。運用判断の勘所が腑に落ちます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次