我有一个.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 -0
POSIX 合规性。
在 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