Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 终止在端口3000上侦听的进程的shell脚本?_Linux_Bash_Sockets_Kill - Fatal编程技术网

Linux 终止在端口3000上侦听的进程的shell脚本?

Linux 终止在端口3000上侦听的进程的shell脚本?,linux,bash,sockets,kill,Linux,Bash,Sockets,Kill,我想定义一个名为kill3000的bash别名来自动执行以下任务: $lsof-i:3000 命令PID用户FD类型设备大小/关闭节点名称 ruby 13402零4u IPv4 2847851 0t0 TCP*:3000(侦听) $kill-913402 将产生 3000/tcp: <$pid> 使用原始lsof命令的另一个选项: lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill

我想定义一个名为
kill3000
的bash别名来自动执行以下任务:

$lsof-i:3000
命令PID用户FD类型设备大小/关闭节点名称
ruby 13402零4u IPv4 2847851 0t0 TCP*:3000(侦听)
$kill-913402
将产生

3000/tcp:     <$pid>

使用原始
lsof
命令的另一个选项:

lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9
如果要在shell脚本中使用此选项,可以将
-r
标志添加到
xargs
以处理没有进程侦听的情况:

... | xargs -r kill -9
怎么样

alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"
试试这个:

    kill -9 $(lsof -i:3000 -t)
-t标志是您想要的:它显示PID,而不显示其他内容

更新 如果找不到进程并且您不想看到错误消息:

    kill -9 $(lsof -i:3000 -t) 2> /dev/null
假设您正在运行bash

更新 Basile的建议非常好:我们应该首先尝试终止进程,通常会终止一个期限,如果失败,则终止一个期限(也称为kill-9):



您可能希望将其设置为bash函数。

fuser-k 3000/tcp

也应该可以工作

不要忘记xargs上的-r:psynthesizerpatel:我个人并不太在意
没有足够的参数的消息。这不像
kill
会发疯,如果init进程没有得到输入(如果我错了,请纠正我);如果您在shell脚本中有类似的东西,并带有“set-e”或“#”/usr/bin/bash-e',kill的失败将导致整个脚本失败。我的座右铭是:如果可以的话,悄悄地成功,如果必须的话,优雅地失败-但总是返回一个有用的退出代码。@syntherPatel:是的,但是如果我只从命令行(“自动化例程”)使用它,我真的想看看是否有什么东西被杀死了,这是实现这一点的简单方法:)在shell脚本中,我可能会添加
-r
或使用
|true
,这样我至少可以看到错误消息。我遇到这个问题是因为我测试了lsof版本。。如果您有一个绑定到多个接口的服务,那么lsof方法也将生成两个相同的PID。我不是在挑剔你-我向上帝发誓。以前从未见过lsof-i:NNNN标志。哦,我建议的另一件事是'-n',这样lsof就不会尝试反向查找任何主机。我建议先使用
kill-TERM
,然后,
kill-kill
我也会在脚本中使用
tcp
,更准确地说是在
lsof-I tcp:3000
中。为什么你想要一个别名而不是bash函数呢?我会制作一个函数,首先做一个
kill-TERM
然后做一个
kill-kill
,因为不给进程一个正确终止的机会…@SteveChambers当它在链接到答案之前写入时,这怎么会是重复的?荒谬的…我之所以选择这个作为答案,是因为我后来发现
lsof-I:3000
在web浏览器中访问服务器时可以带回多个进程(例如:
ruby 587 zero 10u IPv4 2239530 0t0 TCP localhost:3000->localhost:45341(已建立)firefox 26843 zero 63u IPv4 2238948 0t0 TCP localhost:45337->localhost:3000(已建立)
我发现,
fuser-n TCP 3000
最准确地恢复了原始进程,因此,可能是最可靠的。我注意到fuser没有区分本地连接和远程连接,所以我认为如果有一个进程连接到远程端口3000,它也会被杀死。注意,默认情况下,
fuser
发送一个SIGKILL。您可以告诉它使用不同的信号,例如:
fuser-k-TERM-ntcp3000
。由于某些原因,这对我不起作用。在我发出命令并执行netstat-tulpn | grep8001之后,仍然会得到进程的pid。我正在尝试终止tcp端口侦听进程-fuser-k-n tcp 8001Doesn在OSX上不起作用:
未知选项:k
未知选项:n
我非常确定使用
awk
是不必要的,而且无论如何都会失败。通过使用
fuser
输出,我最终意识到显示为第一列的实际上是stderr。
alias kill3000="fuser -k -n tcp 3000"
    kill -9 $(lsof -i:3000 -t) 2> /dev/null
    pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid
alias kill3000="fuser -k -n tcp 3000"