检查 PID 是否正在运行的正确方法是什么?

检查 PID 是否正在运行的正确方法是什么?

我有一个.pid文件,我需要检查该进程是否正在运行。到目前为止,我发现了两个选项

kill -0 `cat something.pid`

如果 pid 未运行,则会打印出错误。我知道这可以重定向到/dev/null,但这让我认为这不是最好的解决方案。

第二种解决方案是使用ps,但它也会在 STDOUT 上打印

ps -ef `cat something.pid`

将输出重定向到/dev/null并仅使用返回的状态代码是否正常,或者这是否表明我做错了什么并且需要不同的命令?

答案1

对于大多数 Linux 发行版来说,枚举 /proc/{pid} 是获取有关正在运行的进程的信息的好方法,通常还可以了解用户空间命令(如“ps”)如何与内核通信。例如,您可以这样做;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

编辑:您应该检查 kpid 是否设置,但这更有用,因为对于未设置的 ${kpid} 它将返回“不存在”。

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

答案2

正如 Anders 所说,您应该使用kill -0POSIX 合规性。

在 Linux 系统上,您还可以检查 /proc 文件系统中是否存在文件,例如,

-f /proc/$(cat something.pid)/status

答案3

如果这是在脚本中(我假设是这种情况,因为您担心打印到标准输出),那么您可以按照以下方式执行此操作:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

查找ps -p具有在 something.pid 中指定的 pid 的进程($()语法是反引号的稍新版本。在某些情况下,反引号需要转义,而新形式2>&1则不需要)。还会重定向该命令的 stderr。

如果ps -p命令未找到具有该 PID 的进程,它将以错误 > 0 退出,因此将else执行。否则kill执行语句。如果您愿意,可以通过执行以下操作来否定上述操作:

if ! ps -p ...

希望这能回答你的问题。显然,在使用诸如 之类的危险命令时要小心谨慎并进行大量测试kill

答案4

如果你有 pid 文件,你可以使用 pgrep 来检查进程是否正在运行:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi

在 Linux 上你也可以检查/proc/$pid文件是否存在:

    if [ -d "/proc/${pid}" ]; then
        echo "Running";
    else
        echo "Not running";
    fi

相关内容