web-dev-qa-db-ja.com

PIDが実行されているかどうかを確認する適切な方法は何ですか?

.pidファイルがあり、プロセスが実行されているかどうかを確認する必要があります。これまでのところ、2つのオプションが見つかりました

kill -0 `cat something.pid`

これは、pidが実行されていない場合にエラーを出力します。これを/dev/nullにリダイレクトできることは知っていますが、これは最善の解決策ではないと思います。

2番目の解決策はpsを使用することですが、STDOUTにも出力されます

ps -ef `cat something.pid`

出力を/dev/nullにリダイレクトして、返されたステータスコードを使用するのは正常ですか、それとも何か問題があり、別のコマンドが必要であることを示していますか?

12
Jakub Arnold

ほとんどのLinuxディストリビューションでは、/ proc/{pid}を列挙することは、実行中のプロセスに関する情報、および通常は「ps」などのユーザー空間コマンドがカーネルと通信する方法に関する情報を取得するための良い方法です。たとえば、次のことができます。

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

編集:kpidが設定されていることを確認する必要がありますが、これは設定されていない$ {kpid}に対して「存在しない」を返すため、より便利です。

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"
10
Tom H

Andersが述べたように、POSIX準拠にはkill -0を使用する必要があります。

Linuxシステムでは、/ procファイルシステムにファイルが存在するかどうかを確認することもできます。たとえば、

-f /proc/$(cat something.pid)/status
6
cjc

これがスクリプト内にある場合(私が標準出力への出力について心配しているので、私はそうだと思います)、次のようにすることができます。

_if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi
_

_ps -p_は、something.pidで指定されたpidを使用してプロセスを探します($()構文は、バックティックの少し新しいバージョンです。特定の状況では、バックティックはエスケープする必要があり、新しいフォームではエスケープできません。 )。 _2>&1_は、そのコマンドのstderrもリダイレクトします。

_ps -p_コマンドがそのPIDのプロセスを見つけられない場合、エラー> 0で終了し、elseが実行されます。それ以外の場合は、killステートメント。あなたがしたいなら、あなたは上記を否定することができます:

_if ! ps -p ...
_

それがあなたの質問に答えることを願っています。 killなどの危険なコマンドを使用するときは、明らかに注意してたくさんテストしてください。

2
webtoe

ここにいくつかのオプションがあります:

  • Init-script(例:/etc/init.d/に配置するスクリプト)を作成していて、Debianベースのディストリビューションを使用している場合は、start-stop-daemon:を使用することをお勧めします。
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    実行中の場合は、終了コード0を取得する必要があります。
  • procpsパッケージのpgrepとpkillを使用できます:
    pgrep --pidfile $PIDFILE
1
jollyroger

Pidファイルがある場合は、pgrepを使用してプロセスが実行されているかどうかを確認できます。

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
0
Dima L.