linux获取进程pid函数,Linux下获取进程的PID
Linux系统中常常需要获取进程的pid进⾏⼀些操作,⽽Linux 的交互式 Shell 与 Shell 脚本存在⼀定的差异,主要是由于后者存在⼀个独⽴的运⾏进程,因此在获取进程 pid 上⼆者也有所区别。
ps 命令
ps命令是最常⽤的Linux命令之⼀,⽤于获取当前系统中的进程信息,ps是显⽰瞬间进程的状态,并不动态连续;如果想对进程进⾏实时监控应该⽤top命令。
ps命令的参数⾮常多,这个可以⾃⼰资料查看,最常⽤的就是ps -ef或者ps -aux了。
ps -aux表⽰显⽰所有包含其他使⽤者的⾏程,⼀般能够获取到⽐较详细的进程信息了,ps -ef也表⽰显⽰所有进程信息,连同命令⾏。因此如果想查⼀个进程,通常这两个命令就⽐较全⾯了。
交互式 Shell 获取 pid
在ps命令的基础上,如果我们知道进程的name,那么可以利⽤grep来获取其pid(需要通过-v来过滤掉grep本⾝),并通过awk显⽰出来。
ps -ef | grep "name" | grep -v grep | awk '{print $2}'
或者直接使⽤awk
ps -ef | awk '/[n]ame/{print $2}'
这⾥名称⾸字母加[]的⽬的是为了避免匹配到awk⾃⾝的进程。
当然,Linux系统也⽀持直接查:
最简单的⽅法是使⽤pgrep:
pgrep -f name
如果需要查到 pid 之后kill掉该进程,还可以使⽤pkill:
pkill -f name
如果是可执⾏程序的话,可以直接使⽤pidof:
pidof name
Bash Shell 脚本获取进程 pid
在使⽤ Shell 脚本获取进程 pid 时,如果直接使⽤上述命令,可能会出现多个 pid 结果,例如:
1
2
3
4
5#! /bin/bash
# process-monitor.sh
process=$1
pid=$(ps x | grep $process | grep -v grep | awk '{print $1}')
grep命令查看进程echo $pid
执⾏ process-monitor.sh 会出现多个结果:
1
2$> sh process-monitor.sh
3036 3098 3099
进⼀步排查可以发现,多出来的⼏个进程实际上是⼦ Shell 的(临时)进程:
1
2
3root 3036 2905 0 09:03 pts/1 00:00:45 /usr/java/jdk1.7.0_71/bin/java ...name root 4522 2905 0 16:12 pts/1 00:00:00 sh process-monitor.sh name
root 4523 4522 0 16:12 pts/1 00:00:00 sh process-monitor.sh name
对于这种情况,我们也只能加⼊更多的grep条件来做进⼀步的判断了
如果我们不确定到的进程是否正确,可以通过判断pid所在的进程是否运⾏:
1
2
3
4
5if ps -p $PID > /dev/null
then
echo "$PID is running"
# Do something knowing the pid exists, i.e. the process with $PID is running
fi
/dev/null是Linux中的⼀个特殊输出位置。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。