Answers:
简单来说,没有:进程(例如守护程序)可能崩溃,并且没有时间清除其.pid文件。
一种更确定程序状态的技术:使用显式通信通道(例如套接字)。将套接字端口写入文件中,并使supervisor
进程进行查找。
您还可以在Linux上使用DBus的服务:注册一个特定名称,并让您的主管进程(无论您叫什么名字)检查该名称。
有许多技术。
要记住的一件事:管理PID文件不是操作系统的责任。
包含进程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,使用grep和grep -v通过一个或多个管道进行管道传输,以尝试过滤掉您不感兴趣的所有其他内容...有点像使用
find . | grep myfile
找出是否存在文件。
Jldupont是正确的。
但是,您可以向进程发送一个0信号(kill -s 0 pid),以查看该进程是否仍在运行(假设您有权发送该信号-通常,只有进程的所有者才可以发送该信号它是一个信号)。
我同意jschmier。
在某些系统上,您无权访问pgrep。在这种情况下,您可以ps -aef | grep <pid>
找出进程是否真正在运行。