web-dev-qa-db-ja.com

特定のプロセスの.pidファイルを見つける方法

私はmonitを設定していて、特定のpythonアプリケーションを監視したいと考えています。Monitは、プロセスの.pidファイルを調べることでこれを行いますが、どこにあるかわかりません。

また、独自の単純な実行可能ファイルを作成して実行しようとしました。ここでも、.pidファイルが作成される場所がわかりません。

そして、すべてのプロセスに.pidファイルがありますか?

15
Yarin

通常、デーモン化されたプロセスのPIDファイルは、Redhat/CentOSスタイルのシステムの/var/run/にあります。

それ以外の場合は、常にプロセスのinitスクリプトを調べることができます。たとえば、SSHデーモンは/etc/init.d/sshdのスクリプトで開始されます。 PIDがそこで定義される場合があります(pid、PID、PIDFILE、PID_FILEなどを検索します)。

ただし、RHELスタイルのシステム上の他のほとんどのデーモンは、いくつかの一般的な機能のために/etc/init.d/functionsスクリプトを提供します。

# Set $pid to pids from /var/run* for {program}.  $pid should be declared
# local in the caller.
# Returns LSB exit code for the 'status' action.
__pids_var_run() {
        local base=${1##*/}
        local pid_file=${2:-/var/run/$base.pid}

/etc/init.d/functionsをソースとするものの場合、PIDは/var/run/*.pidに存在します。

カスタムアプリケーションの場合、PIDはラッパースクリプトで定義されます(うまくいけば)。ただし、私が知っているほとんどの開発者は、上記のデーモンと同じ規則に従っています。

doがPIDファイルなしで何かに遭遇した場合、 Monitはプロセス文字列パターンも監視できます を覚えておいてください。

14
ewwhite

私が取った別のアプローチ:

組み込みモードで実行されているデータベースサーバーがあり、データはそれを含むアプリケーションのディレクトリ内にあります。

データベースには.pidファイルのようなものがありますが、ロックファイルと呼ばれています。このロックファイルを見つけるために、アプリによって開かれたままになっているすべてのファイルを一覧表示しました。

$ ls -l /proc/18264/fd | cut -d'>' -f2

ソケット、パイプ、サーバーファイルなどを含む長いリストが表示されました。フィルターがほとんどなく、必要なものに到達しました。

$ ls -l /proc/18264/fd | cut -d'>' -f2 | grep /home/ | cut -b40- | sort | uniq | grep titan

/windup/reports/group_report.LJfZVIavURqg.report/graph/titangraph/00000000.jdb
/windup/reports/group_report.LJfZVIavURqg.report/graph/titangraph/je.info.0
/windup/reports/group_report.LJfZVIavURqg.report/graph/titangraph/je.info.0.lck
/windup/reports/group_report.LJfZVIavURqg.report/graph/titangraph/je.lck
1
Ondra Žižka