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


15

我正在设置monit,并希望监视给定的python应用程序。Monit通过查看进程的.pid文件来完成此操作,但是我不知道它在哪里。

我也尝试创建自己的简单可执行文件并运行它-在这里我也无法弄清楚.pid文件的创建位置。

并且所有进程都有一个.pid文件吗?


5
并非所有进程都有.pid文件。该应用程序(或其启动脚本)需要显式创建一个。
bahamat 2012年

Answers:


14

您通常会/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也可以在进程字符串模式中进行监视


1
ewwhite-非常感谢-但是当我monit procmatch anything在命令行上尝试时,我得到了 monit: invalid argument -- procmatch。有任何想法吗?
Yarin 2012年

您正在使用哪个版本的Monit?(类型monit -V)哪个操作系统/发行版?
ewwhite

Monit 5.1.1增添到CentOS 6上
Yarin

另外,对于多个非守护进程,我的选择是什么?你怎么看待这个答案
Yarin

@yarin好像您从EPEL存储库中获得了Monit 。RPMForge的 EL6版本是5.4。
ewwhite

1

我采取的另一种方法:

我有一个以嵌入式模式运行的数据库服务器,数据位于包含应用程序的目录中。

该数据库具有类似.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.