检索特定进程名称的 PID 并杀死它

检索特定进程名称的 PID 并杀死它

我正在运行一个测试服务器(本地应用程序),我想获取其进程 ID 并终止。怎么做?

我正在运行test-serverusing 命令nohup ./test-server &,并同时使用以下命令验证进程的 PID

ps -ef | grep 'test-server' | grep -v 'grep' | awk '{ printf $2 }'

输出:

svr-ser+   42707   42618  0 10:43 pts/2    00:00:00 /bin/sh ./test-server
svr-ser+   42709   42707  0 10:43 pts/2    00:00:00 /bin/sh ./test -Dserver_port=1099 -s -j test-server.log
svr-ser+   42734   42709  9 10:43 pts/2    00:00:01 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -Dserver_port=1099 -s -j test-server.log

& 使用以下命令终止进程,

ps -ef | grep 'test-server' | grep -v 'grep' | xargs kill -9

输出:

kill: cannot find process "svr-ser+"
Killed

如何仅检索 42707并杀死它,我想非常具体地杀死该./test-server进程,仅此而已。

答案1

要获取您可以通过正则表达式描述的名称的 PID,就像您对 所做的那样grep,可以简单地使用 来完成pgrep test-server,如 中所示kill -9 $(pgrep test-server)

但这是你不必走的弯路;pkill直接做,pkill -9 test-server.

答案2

尝试

ps -e -H -o pid,comm | awk '$2 ~ /test-server/ { print $1}' 

或其 POSIX 等效项:

ps -Ao pid= -o comm= | awk '$2 ~ /test-server/ { print $1}' 

检查pid

在哪里

  • -H不打印标题
  • -o pid,comm仅打印 pid 和命令行
  • awk过滤test-server(您可能需要调整这部分(例如,$3 ~ /test-server/使用args而不是comm对命令行参数进行过滤)

如果OK,则运行

ps -Ao pid= -o comm= | awk '$2 ~ /test-server/ { print $1}' | xargs kill

答案3

那这个呢?

nohup ./test-server & echo "$!" >测试服务器.pid

然后:

杀死“$(<test-server.pid)”

另外:用 杀死SIGKILL很可能会阻止服务器干净退出;使用SIGTERM(由 发送的默认信号kill)代替。

答案4

使用killall- 按名称杀死进程。

man killall将向您展示用法。这是相当聪明的。

相关内容