笔者最近有个需求,脚本里面运行了后台进程,重新执行脚本时需要先查找出之前运行的进程并杀死

查阅资料,常见有以下方法

方法1:

  • 查找pid

ps -ef | grep name | grep -v grep | awk '{print $2}'

解释

grep -v不显示grep的进程;由于PID在第二列,awk打印进程PID;

也可以使用pgrep name可以直接获取PID

  • 结束进程:

获取完成后使用管道xargs kill -9结束掉查找出来的进程

另外也可以使用pkill -9 name直接结束

方法2:

启动后台进程时,将PID写入文件,然后再次运行时先结束掉PID文件对应的进程再执行

脚本示例:

#!/bin/bash


LAST_PID=`cat /home/zeng/echo.py.pid`

kill -9 $LAST_PID

/usr/bin/python /home/zeng/echo.py &>/home/zeng/echo.py.log &


echo $!>/home/zeng/echo.py.pid


方法3:

方法1中可能错误结束掉其他不应该结束的具有相同名字的进程,而方法2中读写文件步骤比较多,当启动多个后台进程时更是如此

为了解决方法1和方法2的问题我们可以用软链的方式给脚本起一个别名然后再kill

ln -sf /usr/lib/python /home/zeng/mypython

脚本中结束进程也可以使用pgrep mypython | xargs kill -9

脚本示例:

#!/bin/bash

pkill -9 mypython

/home/zeng/mypython /home/zeng/echo.py &>/home/zeng/echo.py.log &