解決策 1:
通常、デーモン化されたプロセスの PID ファイルは /var/run/
にあります。 Redhat/CentOS スタイルのシステムで。
それ以外は、プロセスの 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 はラッパー スクリプトで定義されます (できれば)。ただし、私が知っているほとんどの開発者は、上記のデーモンと同じ規則に従っています。
もし PID ファイルのないものに遭遇した場合、Monit はプロセス文字列パターンでも監視できることを思い出してください。
解決策 2:
私がとった別のアプローチ:
組み込みモードで実行されているデータベース サーバーがあり、データはそれを含むアプリケーションのディレクトリ内にあります。
データベースには .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