Shell编程---监控检查进程是否存活

23 篇文章 2 订阅
18 篇文章 1 订阅
题目要求:使用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/进程号/目录。

注意:
  1. 使用以上几种方法监控进程是否存活要麽需要pid进程号要麽需要进程名。因为进程pid是进程的唯一标识,通过pid进程往往比进程名的方法准确。
  2. 还需要考虑用户权限问题,原因在于:
  • 在执行 "kill -0 进程号"命令时,普通用户只能用于检查自己的进程,因为向其它用户的进程发送信号会因为没有权限而出错,返回值也是1。当然,如果你用特权用户执行 "kill -0 进程号"命令的话,就没有权限问题啦。
  • 有时候在同一服务器上可能会有不同用户运行多个相同进程名的进程,root用户还可以获取所有普通用户下的进程,而普通用户只能获取自己的进程。
解答:
方法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`
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值