题目要求:使用shell脚本监控检查进程是否存活
分析:
对于非守护进程我们一般都会想到直接去判断 “ps -ef |egrep xx |egrep -v egrep” 是否有内容;
对于daemon守护进程,通常都会有自己的pid或者lock文件,然后可以通过检查这些文件是否存在来判断进程是否存活。然而有些异常情况下,pid文件存在进程却并不存在。因此并不能依赖进程的pid文件来检测进程是否存活。有以下几种方法:
第一种:
执行 “kill -0 进程号” 命令。 再执行echo $?
原理:kill -0不会向进程发送任何信号,但是会进行错误检查。
如果返回值为0,说明进程存活;反之,则此进程有存在问题。
第二种:
执行命令"ps -p 进程号", 再执行echo $? 。
原理:根据给定的pid进程号进行错误检查。
如果有这个进程且正常运行,返回值为0;如果没有这个进程或异常,返回值为1。
第三种:
执行命令"pgrep 进程名", 再执行echo $? 。
原理:根据给定的进程名进行错误检查。
如果有这个进程且正常运行,返回值为0;如果没有这个进程或异常,返回值为1。
第四种:
直接判断/proc/进程号/ 这个目录是否存在。
原理:linux内核会通过/proc虚拟文件系统导出系统中正在运行的进程信息,每个进程都有一个/proc/进程号/目录。
注意:
- 使用以上几种方法监控进程是否存活要麽需要pid进程号要麽需要进程名。因为进程pid是进程的唯一标识,通过pid进程往往比进程名的方法准确。
- 还需要考虑用户权限问题,原因在于:
解答:
方法1:
#!/bin/sh
source /etc/profile
#define variable
psUser=$1
psProcess=$2
pid= `ps -ef | egrep ${psProcess} | egrep ${psUser} | egrep -v "grep|vi|tail" | sed -n 1p | awk '{print $2}'`
echo ${pid}
if [ -z ${pid} ];then
echo "The process does not exist."
exit 1
fi
# pgrep ${psProcess}
# kill -0 ${pid}
ps -p ${pid}
result=echo $?
if [ ${result} -ne 0 ];then
echo "The process is not ok."
else
echo "The process is ok."
fi
方法2:
#!/bin/sh
source /etc/profile
#define variable
psUser=$1
psProcess=$2
pid= `ps -ef | egrep ${psProcess} | egrep ${psUser} | egrep -v "grep|vi|tail" | sed -n 1p | awk '{print $2}'`
echo ${pid}
if [ -z ${pid} ];then
echo "The process does not exist."
exit 1
fi
if [ -d /proc/${pid} ];then
echo "The process is not ok."
else
echo "The process is ok."
fi
扩展:
有时我们可能需要得到服务器上某个进程的启动个数,下面的功能是检测某个进程正在运行的个数
processRunNum=`ps -ef | egrep "[ /]${psProcess}" | egrep -v "vi|tail|grep" | wc -l`