如何查找给定进程的 .pid 文件

如何查找给定进程的 .pid 文件

我正在设置 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

相关内容