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

Jak*_*old 15 linux unix bash process pid

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

kill -0 `cat something.pid`
Run Code Online (Sandbox Code Playgroud)

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

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

ps -ef `cat something.pid`
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*Tom 11

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

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"
Run Code Online (Sandbox Code Playgroud)

编辑:您应该检查 kpid 是否已设置,但这更有用,因为它会为 unset ${kpid} 返回“不存在”

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"
Run Code Online (Sandbox Code Playgroud)


cjc*_*cjc 8

正如安德斯所指出的,您应该使用kill -0POSIX 合规性。

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

-f /proc/$(cat something.pid)/status
Run Code Online (Sandbox Code Playgroud)