我想定义一个bash别名名为kill3000
,以自动化以下任务:
$ 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"
lsof -i:3000
会返回多个进程(例如):ruby 587 zero 10u IPv4 2239530 0t0 TCP localhost:3000->localhost:45341 (ESTABLISHED)
firefox 26843 zero 63u IPv4 2238948 0t0 TCP localhost:45337->localhost:3000 (ESTABLISHED)
我发现,fuser -n tcp 3000
最准确地返回原始进程,所以可能是最可靠的使用方法。 - Jonathanfuser
默认会发送 SIGKILL 信号。你可以使用不同的信号来代替,默认信号。例如,你可以这样告诉它使用不同的信号:fuser -k -TERM -n tcp 3000
。 - Stephane Chazelas未知选项:k
未知选项:n
- Dmitri Zaitsev试试这个:
kill -9 $(lsof -i:3000 -t)
kill -9 $(lsof -i:3000 -t) 2> /dev/null
Basile的建议非常好:我们应该首先尝试正常终止进程,使用kill -TERM
,如果失败,则使用kill -KILL
(也称为kill -9
):
pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid
您可能希望将其作为bash函数使用。
kill -TERM
,然后再使用 kill -KILL
。 - Basile Starynkevitchtcp
,例如 lsof -i tcp:3000
,以便更精确。 - Ciro Santilli OurBigBook.com使用原始的 lsof
命令的另一种选项:
lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9
如果您想在shell脚本中使用它,可以添加-r
标志到xargs
,以处理没有进程正在侦听的情况:
... | xargs -r kill -9
kill
命令没有得到输入,它也不会像疯了一样射击你的init进程(如果我错了,请纠正我 ;) - Niklas B.-r
或使用|| true
,这样我至少可以看到错误信息。 - Niklas B.fuser -k 3000/tcp
也应该可以工作。
你能行吗?
alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"
fuser -n tcp 3000
将产生以下输出
3000/tcp: <$pid>
所以你可以这样做:
fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill
awk
是不必要的,而且还会失败。通过操作 fuser
的输出,我最终意识到看起来像第一列的实际上是 stderr。 - Brian Peterson
kill -TERM
,然后再执行kill -KILL
,因为在没有给进程正确终止的机会的情况下杀死进程是不合适的。 - Basile Starynkevitch