我正在设置 monit 并想要监视给定的 python 应用程序。Monit 通过查看进程的 .pid 文件来实现这一点,但我不知道它在哪里。
我也尝试创建自己的简单可执行文件并运行它 - 在这里我也无法弄清楚 .pid 文件是在哪里创建的。
所有进程都有.pid 文件吗?
答案1
/var/run/
您通常会在Redhat/CentOS 风格的系统上找到守护进程的 PID 文件。
除此之外,您始终可以查看进程初始化脚本。例如,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