背景
最近在做测试的时候,需要手动kill服务的进程,然后通过命令重启服务,再进行测试。每次重启都会涉及到下面三个命令的执行:
1)检索进程ID
$ ps -eLf | grep programname
root 1123 112 1234 0 0 0 0:00:00 ? 00:00:00 programname xxx#ps: process status的缩写
#-e 选项表示显示所有进程(包括其他用户的进程)。
#-L 选项表示显示所有线程(如果进程是多线程的)。
#-f 选项表示显示完整格式的进程信息,包括用户、进程ID、父进程ID、CPU时间等。
#结果中第二个是PID(即进程ID)
2)kill进程
$ kill -9 1123# kill -9 强制终止进程
# 1123为上面获取到的进程ID
3)重启服务
$ xxx service start# 某个服务启动命令
PS:为什么不在本地开发测试,因为需要GPU运行服务,所以需要有GPU的环境。目前比较笨的办法是本地用开发工具修改之后,传递到GPU的服务器上运行,每次修改,都需要重启一下服务以反映修改的代码。
课题
虽然只有三个命令,每次都要执行三次,还要拷贝PID,次数多了也费时间,还容易出错。
改进方法
本着能够自动化就不要手动的理念,直接将上面的命令写成一个shell,将三次执行变成shell的执行
restart_service.sh
#!/bin/bash# 要查找和终止的命令名称
COMMAND_NAME="command_name"
# 查找包含指定命令的进程ID
# ---awk 'NR==1 {print $2}':只有一个进程,所以从第一行提取进程ID(第二列)即可
# ---grep -v grep 从搜索结果中排除包含 grep 命令本身的行
PID=$(ps -eLf | grep "$COMMAND_NAME" | grep -v grep | awk 'NR==1 {print $2}')
# 是否存在进程 (-z 测试字符串是否为空)
if [ -z "$PIDS" ]; thenecho "没有查找到包含'${COMMAND_NAME}'的进程"
elseecho "杀死以下包含命令 '$COMMAND_NAME' 的进程:'$PIDS'"kill -9 $PID
fi#重启服务
echo "重启服务"
xxx service start
每次修改完毕之后,执行该shell即可。
$ ./restart_service.sh