我正在运行一个测试服务器(本地应用程序),我想获取其进程 ID 并终止。怎么做?
我正在运行test-server
using 命令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
将向您展示用法。这是相当聪明的。