如何在Linux上仅获取指定进程名称的进程ID?

91
如何在Linux上仅获取指定进程名称的进程ID?
ps -ef|grep java
test 31372 31265  0 13:41 pts/1    00:00:00 grep java

根据进程ID,我将编写一些逻辑。那么,我如何仅获取特定进程名称的进程ID呢?
示例程序:
PIDS= ps -ef|grep java
if [ -z "$PIDS" ]; then
echo "nothing"
else
mail test@domain.example
fi
5个回答

105

您可以使用:

ps -ef | grep '[j]ava'

或者如果pgrep可用,则最好使用:

pgrep -f java

1
很棒的答案 pgrep -f java。它可以用于仅获取PID。 - DollyShukla
1
你的第一个答案并没有仅返回 pid,而是返回了所有信息(在Ubuntu上)。顺便问一下:方括号的作用是什么?我找不到相关文档。 - dur
方括号用于从ps输出中排除grep进程。 - anubhava

105
您可以将输出通过管道传递给awk,以仅打印PID。例如:
ps -ef | grep nginx | awk '{print $2}'
9439

功能良好,但如果您使用输出作为变量,则必须在命令末尾添加 | tr -d '\n' - рüффп
这是一个可以用来选择文件中特定记录并对其执行操作的程序。它非常广泛,甚至可以使用它编写一些程序。AWK文档 - Gilberto Treviño

80
请使用以下命令:ps -C <进程名> -o pid=

18
为什么这个被投票否决了?它不仅看起来可行,而且使用了所需的命令ps,没有使用管道过滤器。在我的情况下,我无法使用管道(原因..),所以这个真是救命稻草。你可能需要花整整一天去阅读PS的手册...谢谢@ventsyv - Scott Prive
2
也许是因为它不是非常便携,但其他解决方案也不是,而且最初的问题标记为Redhat Linux。我碰巧看到我的一位工程师提交了一个需要在OSX、RHEL Linux和AIX上检测特定Java进程的便携式方法,这就是他们想出来的:ps -A -o pid,args | grep \[j]ava - ikaerom

25

这个命令不考虑grep进程,只返回PID:

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

1
更简洁:ps -ef | grep '[j]ava' | awk '{print $2}' - user2849202
我使用此命令获取PID。在将输出用作变量时要小心,在末尾必须添加| tr -d '\n' - рüффп
在busybox v1.24.1上,这对我有效:ps | grep -v grep | grep cli | awk '{print $1}' - Arkham Angel
这个:ps | awk '$NF ~ /cli/ {print $1}' - Arkham Angel
1
感谢您的评论,忽略grep进程是一个不错的补充。 - Arthur Bowers

22

在Ubuntu 16.04上干净快速 - sashaboulouds
2
只要您没有多个实例(例如Java),它就能正常工作。 - рüффп

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接