shell脚本杀死在端口3000上侦听的进程?
我想定义一个名为kill3000
的bash别名来自动执行以下任务:
$ lsof -i:3000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 13402 zero 4u IPv4 2847851 0t0 TCP *:3000 (LISTEN) $ kill -9 13402
alias kill3000="fuser -k -n tcp 3000"
尝试这个:
kill -9 $(lsof -i:3000 -t)
-t标志是你想要的:它显示PID,而不是别的。
UPDATE
万一过程没有find,你不想看到错误信息:
kill -9 $(lsof -i:3000 -t) 2> /dev/null
假设你正在运行bash。
UPDATE
Basile的build议非常好:我们应该先尝试终止进程正常情况下会杀死-TERM ,如果失败的话kill -KILL (AKA kill -9 ):
pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid
你可能想要这个bash函数。
使用原始lsof
命令的另一个选项:
lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9
如果你想在shell脚本中使用它,你可以添加-r
标志到xargs
来处理没有进程正在监听的情况:
... | xargs -r kill -9
fuser -n tcp 3000
将产生的输出
3000/tcp: <$pid>
所以你可以这样做:
fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill
怎么样
alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"
fuser -k 3000/tcp
也应该可以工作