MENU

実行中のプロセスを名前で止める方法|応答なし時の強制終了まで

目次

結論:プロセス名で止める最短手順

プロセス名を指定して停止するには pkill が最もシンプルです。以下は nginx を止める例です。

# プロセス名を指定して SIGTERM を送信(正常終了を要求)
pkill nginx

# 停止を確認(何も表示されなければ停止済み)
pgrep nginx

pgrep nginx が何も返さなければ停止完了です。数秒待っても PID が残っている場合は、後述の強制終了(SIGKILL)に切り替えます。

注意: pkill はデフォルトで部分一致します。たとえば pkill post と打つと postfixpostgresql も同時に止まります。事前に pgrep で対象を絞り込んでから実行するのが実務の鉄則です。

停止前に対象プロセスを確認する

名前だけで止める前に、実際に何が動いているかを確認します。pgrep -a はプロセス名とコマンドライン引数を PID と一緒に表示するため、同名プロセスが複数あるときの判断に役立ちます。

# プロセス名に一致する PID とコマンドラインを表示
pgrep -a nginx

# ユーザー・CPU・メモリも合わせて確認したい場合
ps aux | grep nginx

出力例:

1234 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
1235 nginx: worker process
1236 nginx: worker process

マスタープロセスとワーカーが混在しているケースでは、pkill nginx が全プロセスに SIGTERM を送ります。マスターが正しくシャットダウンシーケンスを実行するかどうかはサービスの実装次第です。次のセクションで説明する systemctl 経由で止める方が確実です。

systemd で管理されているサービスはこちらが正解

Ubuntu・Debian・Rocky Linux・AlmaLinux など、現代の主要ディストリビューションではサービスは systemd が管理しています。プロセスを直接 pkill で叩くよりも systemctl stop を使う方が安全で、Restart=always 設定との競合も防げます。

# まずサービスが systemd で管理されているか確認
systemctl status nginx

# 正しい停止方法
sudo systemctl stop nginx

# 停止を確認("inactive" が返れば停止済み)
systemctl is-active nginx

ある運用現場では「何度 kill しても nginx が再起動してくる」と困惑するケースがありました。原因は Restart=on-failure の設定で、pkill によるプロセス終了を障害と判断した systemd がすぐに再起動していたものです。systemctl stop はこの再起動ループを回避します。

# 動作中のサービス一覧を確認
systemctl list-units --type=service --state=running

SIGTERM で止まらない場合の強制終了

ハングしたプロセスやシグナルを無視するプロセスには SIGKILL(-9)で強制終了します。ただし SIGKILL はプロセスに後処理の機会を与えません。ファイルの書き込み中であればデータが破損する可能性があるため、必ず最後の手段として使います。

# まず通常の停止(SIGTERM)を試みる
pkill nginx

# 数秒待っても残っている場合のみ強制終了(SIGKILL)
pkill -SIGKILL nginx

シグナルを試す順番は SIGTERM → SIGHUP → SIGKILL が実務上の定石です。SIGHUP は多くのデーモンで「設定の再読み込み」として実装されており、グレースフルな状態遷移につながる場合があります。

# 設定再読み込みで代替できないか試す(nginx・sshd など多くのデーモンに有効)
pkill -HUP nginx

複数の同名プロセスが動いている場合の対処

PostgreSQL のように同名プロセスが複数動くケースでは、特定の PID だけを止めたい場面があります。pgrep で対象を特定してから kill に渡す方法が確実です。

# PID と起動引数を確認
pgrep -a postgres

# 特定の PID にだけ SIGTERM を送る
kill 1234

# 終了を確認("No such process" なら終了済み)
ps -p 1234

スクリプトで同名プロセスを一括停止する場合は、pkill--exact オプションを付けて完全一致に絞ると意図しない停止を防げます。

# 完全一致で停止("postgres-worker" などは除外)
pkill --exact postgres

# killall も Linux では完全一致がデフォルト
killall postgres

注意: killall は Linux では名前の完全一致ですが、macOS・BSD 系では「全プロセスを終了する」コマンドです。複数の OS をまたいで作業する環境では pkill --exact に統一しておくと安全です。

誤操作を防ぐ:止める前の 3 ステップ確認

本番環境でのプロセス停止は、確認を省いた一発コマンドが重大障害につながります。次の 3 ステップを習慣にしておくと、意図しない停止を防げます。

# ステップ 1:対象プロセスの PID とコマンドラインを確認
pgrep -a <プロセス名>

# ステップ 2:systemd 管理かどうか確認
systemctl status <サービス名>

# ステップ 3:適切な方法で停止
#   systemd 管理 → sudo systemctl stop <サービス名>
#   それ以外    → pkill --exact <プロセス名>

停止後にプロセスが予期せず再起動してくる場合は、systemctl disable でサービスの自動起動も無効化します。

# 今すぐ停止 + 次回起動後も起動させない
sudo systemctl stop nginx
sudo systemctl disable nginx

「今すぐ止める」だけなら pkill で十分ですが、「次回起動後も起動させない」には systemctl disable が必要です。目的に応じて使い分けることで、意図しない再起動に悩まされずに済みます。

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

新しいシェルプログラミングの教科書

現場で使えるシェルスクリプトの書き方を基礎から実務レベルまで解説。定型作業の自動化に役立ちます。

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

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

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

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

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

この記事を書いた人

目次