shell脚本实现关闭指定程序名的进程
1、 基础篇
在Linux系统下,我们进行程序调试或者是进行应用程序升级时,经常需要先对我们的目标程序进行kill关闭。此时最基础的办法就是先查找到目标进程的PID,然后再执行kill命令去关闭目标进程。
如:我们想要关闭掉svn相关的进程,首先执行ps -aux | grep svn找到当前系统中有svnserve的进程,其PID为15889,
接着直接执行kill -9 15889就可以关闭掉此svn的进程了。
2、 实践篇
从上面可以看出,要实现依据进程名来进行进程的关闭其实只要将上述查找和kill的两步合并起来实现即可。
1) command命令执行
ps -ef | grep procedure_name | grep -v grep | awk '{print $2}' | xargs kill -9
上面指令中的procedure_name 即为所有关闭的进程名
2) shell脚本运行
下面采用一个通用的shell脚本方式,来实现此功能,执行下述脚本
./close_p.sh rocedure_name
注意:因脚本执行时,脚本自身的进程名中会带有待关闭的进程名,需在脚本编写时进行相应的处理。
close_p.sh脚本的实现比较简单,内容如下:
#!/bin/bash
echo "***************************"
echo "Close the progress by name!"
echo "eg: ./close_p.sh progressName"
echo "***************************"
echo
#echo "PID of this script: $$"
#echo "PPID of this script: $PPID"
function MsgShow()
{
if [ $# -lt 1 ] ; then
echo "Parm err ! Exit the shell !";
exit 1;
else
case ${1} in
PARMMISS)
echo "Missing process name to close!"
;;
NOPROSS)
echo "No such process[$2]!"
;;
MULTIPROSS)
echo "There are too many process contains name[$2]"
;;
*)
echo "Default case!"
;;
esac
exit 1;
fi
}
function PidFind()
{
PIDCOUNT=`ps -ef | grep $1 | grep -v "grep" | grep -v $0 | awk '{print $2}' | wc -l`;
if [ ${PIDCOUNT} -gt 1 ] ; then
MsgShow MULTIPROSS $1;
elif [ ${PIDCOUNT} -le 0 ] ; then
MsgShow NOPROSS $1;
else
PID=`ps -ef | grep $1 | grep -v "grep" | grep -v ".sh" | awk '{print $2}'` ;
echo "Find the PID of this progress!--- process:$1 PID=[${PID}] ";
fi
read -p "Are you sure you want to close this progress[y/n]: "
if [ $REPLY = "y" ] || [ $REPLY = "yes" ] ; then
echo "Kill the process $1 ...";
kill -9 ${PID};
echo "kill -9 ${PID} done!";
else
echo "Confirmation of canceling,exit!";
exit 1
fi
#if we use return ,the return val must between 0 and 255
}
if [ $# -lt 1 ] ; then
MsgShow PARMMISS;
else
PidFind $1;
fi
3、 参考篇
有关Shell脚本知识可以参考:《shell脚本学习指南》
有关awk知识可以参考:《sed与awk》
注:若在拷贝上述.sh文件至linux后,需要注意编码格式的问题。
因为脚本在windows下创建编辑然后上传到linux系统的,所以是dos格式的,而linux却是只能执行格式为unix格式的脚本
在linux中采用vim close_p.sh,执行set ff查看当前文件的格式,若为doc格式的话执行将会出现类似的错误:
[root@localhost work]# ./close_p.sh
-bash: ./close_p.sh: /bin/bash^M: bad interpreter: No such file or directory
此时我们需要执行set ff=unix,然后再次set ff检测文件格式是否已经修改为unix格式,保存文件后并可以正常执行了