linux shell 根据进程名获取pid的实现方法
导读
Linux的交互式Shell与Shell脚本存在一定的差异,主要是由于后者存在一个独立的运行进程,因此在获取进程pid上二者也有所区别。
交互式BashShell获取进程pid
在已知进程名(name)的前提下,交互式Shell获取进程pid有很多种方法,典型的通过grep获取pid的方法为(这里添加-vgrep是为了避免匹配到grep进程):
ps-ef|grep"name"|grep-vgrep|awk'{print$2}'
或者不使用grep(这里名称首字母加[]的目的是为了避免匹配到awk自身的进程):
ps-ef|awk'/[n]ame/{print$2}'
如果只使用x参数的话则pid应该位于第一位:
psx|awk'/[n]ame/{print$1}'
最简单的方法是使用pgrep:
pgrep-fname
如果需要查找到pid之后kill掉该进程,还可以使用pkill:
pkill-fname
如果是可执行程序的话,可以直接使用pidof
pidofname
BashShell脚本获取进程pid
根据进程名获取进程pid
在使用Shell脚本获取进程pid时,如果直接使用上述命令,会出现多个pid结果,例如
#!/bin/bash #process-monitor.sh process=$1 pid=$(psx|grep$process|grep-vgrep|awk'{print$1}') echo$pid
执行process-monitor.sh会出现多个结果:
$>shprocess-monitor.sh 303630983099
进一步排查可以发现,多出来的几个进程实际上是子Shell的(临时)进程:
root30362905009:03pts/100:00:45/usr/java/jdk1.7.0_71/bin/java...name root45222905016:12pts/100:00:00shprocess-monitor.shname root45234522016:12pts/100:00:00shprocess-monitor.shname
其中3036是需要查找的进程pid,而4522、4523就是子Shell的pid。为了避免这种情况,需要进一步明确查找条件,考虑到所要查找的是Java程序,就可以通过Java的关键字进行匹配:
#!/bin/bash #process-monitor.sh process=$1 pid=$(ps-ef|grep$process|grep'/bin/java'|grep-vgrep|awk'{print$2}') echo$pid
获取Shell脚本自身进程pid
这里涉及两个指令:
1.$$:当前Shell进程的pid
2.2.$!:上一个后台进程的pid可以使用这两个指令来获取相应的进程pid。例如,如果需要获取某个正在执行的进程的pid(并写入指定的文件):
myCommand&&pid=$! myCommand&echo$!>/path/to/pid.file
注意,在脚本中执行$!只会显示子Shell的后台进程pid,如果子Shell先前没有启动后台进程,则没有输出。
查看指定进程是否存在
在获取到pid之后,还可以根据pid查看对应的进程是否存在(运行),这个方法也可以用于kill指定的进程。
ifps-p$PID>/dev/null then echo"$PIDisrunning" #Dosomethingknowingthepidexists,i.e.theprocesswith$PIDisrunning fi
到此这篇关于linuxshell根据进程名获取pid的实现方法的文章就介绍到这了,更多相关shell进程名获取pid内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!