Řešení 1:
Soubory PID pro démonizované procesy obvykle najdete v /var/run/
na systémech ve stylu Redhat/CentOS.
Krátce na to se můžete vždy podívat do skriptu procesu init. Například démon SSH se spouští pomocí skriptu v /etc/init.d/sshd
. Někdy tam bude PID definováno (hledání pid, PID, PIDFILE, PID_FILE atd.).
Většina ostatních démonů na systémech ve stylu RHEL však pochází z /etc/init.d/functions
skript pro některé běžné funkce.
# 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}
Pro vše, co je zdrojem /etc/init.d/functions
, PID bude žít v /var/run/*.pid
.
U vlastních aplikací bude PID definováno ve skriptu obalu (doufejme). Většina vývojářů, které znám, se však řídí stejnou konvencí jako démoni výše.
Pokud uděláte narazíte na něco bez souboru PID, pamatujte, že Monit může monitorovat i vzor procesního řetězce.
Řešení 2:
Další přístup, který jsem zvolil:
Mám databázový server spuštěný v embedded režimu a data jsou v adresáři obsahující aplikaci.
Databáze má něco jako soubor .pid, ale nazývá to lock file. K nalezení tohoto souboru zámku jsem uvedl seznam všech souborů, které aplikace drží otevřené:
$ ls -l /proc/18264/fd | cut -d'>' -f2
To mi dalo dlouhý seznam včetně soketů, rour, serverových souborů atd. Pár filtrů a dostal jsem se k tomu, co jsem potřeboval:
$ 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