Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运行进程,因此在获取进程 pid 上二者也有所区别。

交互式 Bash Shell 获取进程 pid

在已知进程名(name)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 -v grep是为了避免匹配到 grep 进程):

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

或者不使用 grep(这里名称首字母加[]的目的是为了避免匹配到 awk 自身的进程):


ps -ef | awk '/[n]ame/{print $2}'

如果只使用 x 参数的话则 pid 应该位于第一位:

ps x | awk '/[n]ame/{print $1}'

最简单的方法是使用 pgrep:

pgrep -f name

如果需要查找到 pid 之后 kill 掉该进程,还可以使用 pkill:

pkill -f name

如果是可执行程序的话,可以直接使用 pidof

pidof name

获取jmeter_pid

[root@izwz9c6q7af34lokld0hqcz ~]# ps -ef | grep "jmeter" | grep -v grep | awk '{print $2}'    
18406
18408
18442

编写shell

#!/bin/bash

#jmeter kill and start

echo -e '\033[32m--------Jmeter---------------\033[0m'
echo "kill掉jmeter-server 进程................... \n"
kill -9 `ps aux | grep jmeter | grep -v grep | awk '{print $2}'`
sleep 3
cd /root/tools/apache-jmeter-3.3/bin/
echo "启动jmeter-server"
nohup ./jmeter-server &
echo -e '\033[32m------------欢迎使用-----------------\033[0m'