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


12

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

kill -0 `cat something.pid`

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

2番目の解決策はを使用することpsです。ただし、STDOUTにも印刷されます

ps -ef `cat something.pid`

出力をリダイレクトし、/dev/null返されたステータスコードを使用するのは正常ですか、それとも何か間違っているので別のコマンドが必要な兆候ですか?


5
kill -0標準(POSIX)準拠のまま使用します。
アンデルス

回答:


9

ほとんどの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"

@SteveMusterこれにより、回答がLinux固有になります。OSXには/ procはありません。そして、BSDには/ procはないと思います。
アッシュ14年

これに注意して${kpid}存在することを確認する必要があります
ウィルフ

@Wilf編集したので、未設定の$ {kpid}に対して「プロセスが存在しません」を返します
トムH

ありがとう-私は同様の方法を使用してPIDをチェックするスクリプトを実行していましたが、これが問題であることが判明するまで機能しませんでした:)
Wilf

6

Andersが指摘したように、kill -0POSIX準拠に使用する必要があります。

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

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

1

これがスクリプト内にある場合(stdoutへの印刷が心配であるためだと思います)、次のように実行できます。

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 -psomething.pidで指定されたPIDを持つプロセスのルックスは($()構文は、バッククォートの少し新しいバージョンです。バッククォートは、新しいフォームにはない特定の状況ではエスケープが必要)。の2>&1リダイレクトは、同様にそのコマンドの標準エラー出力します。

ps -pコマンドがそのPIDを持つプロセスを見つけられない場合、エラー> 0で終了するため、else実行されます。それ以外の場合、killステートメント。必要に応じて上記を無効にすることができます:

if ! ps -p ...

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


1

以下にいくつかのオプションを示します。

  • 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

0

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

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.