.pid
ファイルがあり、プロセスが実行されているかどうかを確認する必要があります。これまでのところ、2つのオプションが見つかりました
kill -0 `cat something.pid`
これは、pidが実行されていない場合にエラーを出力します。これを/dev/null
にリダイレクトできることは知っていますが、これは最善の解決策ではないと思います。
2番目の解決策はps
を使用することですが、STDOUTにも出力されます
ps -ef `cat something.pid`
出力を/dev/null
にリダイレクトして、返されたステータスコードを使用するのは正常ですか、それとも何か問題があり、別のコマンドが必要であることを示していますか?
ほとんどの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"
Andersが述べたように、POSIX準拠にはkill -0
を使用する必要があります。
Linuxシステムでは、/ procファイルシステムにファイルが存在するかどうかを確認することもできます。たとえば、
-f /proc/$(cat something.pid)/status
これがスクリプト内にある場合(私が標準出力への出力について心配しているので、私はそうだと思います)、次のようにすることができます。
_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
などの危険なコマンドを使用するときは、明らかに注意してたくさんテストしてください。
ここにいくつかのオプションがあります:
/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
Pidファイルがある場合は、pgrepを使用してプロセスが実行されているかどうかを確認できます。
if pgrep -F something.pid; then
echo "Running"
else
echo "Not running"
fi