以下の内容はhttps://devlights.hatenablog.com/entry/2025/08/28/073000より取得しました。


プロセスの生存確認方法あれこれ (kill -0, ps -p, /proc/PID, pgrep)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。周りに知らない人が結構いたので、そのためのメモも兼ねて。

業務で、サーバ側(Linux)で特定のプロセスが生存しているかどうかを確認したり、プロセスが死んだら何かをするという作業が結構あります。

大抵はシェルスクリプトなどで実装したりすることが多いのですが、その際に ps コマンドでやってる人が結構多かったりします。

確認方法としてはいろいろありますが、たいてい以下の4つのどれかになるでしょう。

  • kill -0
  • ps -p
  • /proc/PID
  • pgrep -q

上記のどの方法でもプロセスが生存しているのかは確認できます。

んで、この中で最速なものは何か?ってなると

kill -0

です。kill -0 は、シグナル0(ヌルシグナル)をプロセスに送信します。ヌルシグナルはプロセスに一切何も影響を与えないシグナルで、且つ、システムコール一発で完結します。(kill(pid, 0)がカーネルレベルのシステムコールで呼び出される)

なので、これが一番速いし効率が良いです。逆に ps と pgrep はコマンドを別途起動することになることに加えて、プロセステーブルも舐めて確認する処理となるので、速度的には上記の4つの中では下位です。

まあ、カリカリに速度が必要な場面ってそんなに無いのですが、もしかしたら知ってると幸せになるときが来るかも知れません。

サンプル

kill -0

# 確認1
if kill -0 $PID 2>/dev/null; then
    echo "プロセス $PID は実行中です"
else
    echo "プロセス $PID は存在しません"
fi

# 確認2
if ! kill -0 $PID 2>/dev/null; then
    echo "エラー: プロセス $PID が見つかりません"
    exit 1
fi

# 確認3
while kill -0 $PID 2>/dev/null; do
    echo "プロセス $PID を監視中..."
    sleep 5
done
echo "プロセス $PID が終了しました"

ps -p

if ! ps -p $PID > /dev/null 2>&1; then
    echo "エラー: プロセス $PID が見つかりません"
    exit 1
fi

/proc/PID

if [ ! -d "/proc/$PID" ]; then
    echo "エラー: プロセス $PID が見つかりません"
    exit 1
fi

pgrep -q

if ! pgrep -q "^$PID$"; then
    echo "エラー: プロセス $PID が見つかりません"
    exit 1
fi

シンプルな起動確認スクリプト

すごくシンプルにするとこんな感じですね。実務で使うにはいろいろ足りてませんが。(タイムアウト時の動きとか、プロセスは起動したけどちゃんとREADYになったかどうかの確認とか)

#!/bin/bash

start_application() {
    local app_name="$1"
    local max_wait=30
    local wait_count=0

    if [ -z "$app_name" ]; then
        echo "エラー: アプリケーション名が指定されていません"
        return 1
    fi

    "$app_name" &
    local app_pid=$!

    if [ -z "$app_pid" ]; then
        echo "エラー: PID取得失敗"
        return 1
    fi

    echo "アプリケーション起動中... (PID: $app_pid)"

    while [ $wait_count -lt $max_wait ]; do
        if kill -0 "$app_pid" 2>/dev/null; then
            echo "アプリケーション起動完了 (PID: $app_pid)"
            return 0
        fi
        sleep 1
        ((wait_count++))
    done

    echo "エラー: アプリケーション起動失敗またはタイムアウト"

    return 1
}

if [ $# -eq 0 ]; then
    echo "使用法: $0 <アプリケーション名>"
    exit 1
fi

start_application "$1"

参考情報


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。




以上の内容はhttps://devlights.hatenablog.com/entry/2025/08/28/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14