正如标题所说,我正在运行多个游戏服务器,每个服务器都有相同的name
但不同的PID
和port
号码。 我想要匹配监听某个端口的服务器的PID
,然后我想杀死这个进程。 我需要这样做才能完成我的bash脚本。
这样做可能吗? 因为我在网上还没有找到任何解决方案。
可以传递给kill命令的简短版本:
lsof -i:80 -t
netstat
的 -p
标志可以给出进程的 PID:
netstat -l -p
*如果显示-
而不是PID,请使用sudo
编辑:在FreeBSD中获取套接字用户的PID所需的命令是sockstat
。
正如我们在与@Cyclone的讨论中解决的那样,执行此任务的行是:
sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
netstat -nlp | grep :80
代替。该命令的意思是列出所有正在监听端口80的进程信息。 - stanwisenetstat
被称为。它有其他语法。 - stanwisefuser $PORT/tcp
扩展语法对于管道操作更加优秀(适用于coreutils
),因此我更喜欢它,虽然netstat -p -l | grep $PORT
和lsof -i :$PORT
也是不错的解决方案。
pid=`fuser $PORT/tcp`
它会输出纯粹的 pid,所以你可以省略 sed
魔法。
fuser
工具让我爱不释手的一个原因是它可以直接向该进程发送信号(这种语法也是 POSIX 的扩展):
$ fuser -k $port/tcp # with SIGKILL
$ fuser -k -15 $port/tcp # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM
FreeBSD也支持-k选项:http://www.freebsd.org/cgi/man.cgi?query=fuser
netstat -nlp
命令可以告诉你哪个进程在监听哪个端口。
语法:
kill -9 $(lsof -t -i:端口号)
示例: 要杀死在端口4200运行的进程,请运行以下命令
kill -9 $(lsof -t -i:4200)
在Ubuntu系统中测试通过。
由于我的计算机上没有原生安装sockstat,所以我修改了stanwise的答案,改用netstat代替。
netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""
我希望通过Bash脚本实现杀掉监听在指定端口上的进程,且不需其他编程语言。这涉及到IT技术。
假设需要关闭8089端口,则以下是实现方法:
badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid
function kill-listener { lsof -i:$1 -t | xargs kill -9 }
使用您提供的端口8089的示例:kill-listener 8089
- Hurricane Hamilton在Windows系统中,获取进程ID的netstat选项为-o,-p用于选择协议过滤器,例如: netstat -a -p tcp -o
lsof -i4TCP:80 -sTCP:LISTEN -t
可能是您想要的命令。 - Nevirkill -9 \
lsof -i:80 -t`` - bmjrowe