.pid文件对于确定进程是否正在运行是否可靠?


11

许多程序(例如sshd)在/ var / run /中创建包含其进程ID的.pid文件。这些文件对于确定进程是否正在运行是否可靠?我的猜测是这些文件是由进程手动创建的,因此如果程序崩溃,它们仍将保留在文件系统中。

Answers:


16

简单来说,没有:进程(例如守护程序)可能崩溃,并且没有时间清除其.pid文件。

一种更确定程序状态的技术:使用显式通信通道(例如套接字)。将套接字端口写入文件中,并使supervisor进程进行查找。

您还可以在Linux上使用DBus的服务:注册一个特定名称,并让您的主管进程(无论您叫什么名字)检查该名称。

有许多技术。

要记住的一件事:管理PID文件不是操作系统的责任。


1
但是,pid文件的存在与进程的存在相结合应该足够了。如果该过程退出,则可以进行检查。PID确实可以重用,但不是很经常。
MarkR 2010年

2
pid被重用的频率取决于所讨论的特定系统。我已经看到一个系统至少每天循环一次PID。您必须检查pid,有一个进程,并且该进程似乎是您希望拥有pid的进程。

@atk:完全是。没有一个标准的本质,即使有一个标准,它也很可能不被某些实现所尊重。例如,我可以设计一个根本不写入PID文件的守护程序,并使用反向通道从中获取其管理命令。
jldupont 2010年

@atk:不幸的是,没有办法确保PID在检查和使用之间不会被重用……
SamB 2015年

3

Jldupont指出.pid文件对于确定进程是否正在运行不可靠是正确的,因为在崩溃时可能无法删除该文件。

除了种族条件,当我需要知道某个进程是否正在运行时,我经常使用pgrep。如果需要,我可以将输出与.pid文件进行交叉引用。


3

包含进程ID的文件不可靠,请确定进程是否正在运行。找出该进程的最后给定进程ID只是一个可靠的来源。

拥有进程ID时,如果进程确实在运行,则必须进行进一步检查。

这是一个例子:

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

pgrep是一个很好的命令,但是当您有多个实例在运行时,您会遇到麻烦。例如,当您在端口TCP / 22上运行一个常规sshd,而在端口TCP / 2222上运行另一个sshd时,则pgrep在搜索sshd时将提供两个进程ID ...当普通sshd在/ var中具有其pid时/run/sshd.pid和另一个可以在/var/run/sshd-other.pid中具有其pid,您可以清楚地区分进程。

建议仅使用ps,使用grepgrep -v通过一个或多个管道进行管道传输,以尝试过滤掉您不感兴趣的所有其他内容...有点像使用

find . | grep myfile

找出是否存在文件。


2

简单地检查是否存在与文件中包含的pid相同的进程是不可靠的。

但是许多pidfile实现也确实对pidfile进行了锁定,因此,如果进程终止,则该锁定将消失。如果锁定机制是可靠的,则检查文件是否仍被锁定是确定原始进程是否仍在运行的相对可靠的机制。


1

Jldupont是正确的。

但是,您可以向进程发送一个0信号(kill -s 0 pid),以查看该进程是否仍在运行(假设您有权发送该信号-通常,只有进程的所有者才可以发送该信号它是一个信号)。


4
但是,检查是否存在具有该PID的进程并不意味着它就是您感兴趣的PID。
2010年

0

我同意jschmier。

在某些系统上,您无权访问pgrep。在这种情况下,您可以ps -aef | grep <pid>找出进程是否真正在运行。


1
问题的关键是“可靠”。做ps并寻找PID是不可靠的。
2010年

好吧...假设您知道该程序的名称,为什么会认为ps -aef | grep不可靠吗?
2010年

3
竞争条件:ps完成时,系统状态已更改。进程标题:另一个进程的标题可能与您感兴趣的标题相似。多个实例:考虑一个系统,该系统具有两个相同服务的实例,每个实例都有一个PID文件。一个失败,另一个重新启动并获取第一个服务的PID。你怎么知道 等等,不可靠,由于比赛条件不可能正确,还有可靠的技术才行得通。有关可靠的替代方法,请参见,例如cr.yp.to/daemontools.html
2010年
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.