Bash 如何从lsof访问PID。
给定以下命令Bash 如何从lsof访问PID。,bash,terminal,Bash,Terminal,给定以下命令lsof-i:1025i get: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 12345 john 11u IPv4 0xb2f4161230e18fd57 0t0 TCP localhost:foobar (LISTEN) 我正试图编写一个脚本来获取PID(12345)并杀死它。现在我必须运行lsof-I:1025,获取PID,然后运行kill-912
lsof-i:1025
i get:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 12345 john 11u IPv4 0xb2f4161230e18fd57 0t0 TCP localhost:foobar (LISTEN)
我正试图编写一个脚本来获取PID(12345)并杀死它。现在我必须运行lsof-I:1025,获取PID,然后运行kill-912345,类似于:
#!/bin/bash --
x=`lsof -Fp -i:1025`
kill -9 ${x##p}
我应该这样做。第三行运行lsof
,使用-F
选项仅获取pid,并带有一个前导的p
。下一行从lsof
的输出中删除前导p,并将结果用作kill
命令中的pid
编辑:在某个点上,
lsof
被修改,所以前面带有f
的文件描述符总是被输出,不管您是否要求(这对我来说没有意义,但我知道什么)。虽然可以在后引号中加上| grep'^p'
,但更简单的方法是使用-t
选项,如下面fabianopinto的回答所述。man lsof
表示可以使用-F
指定要输出的字段,以便其他程序进行处理。所以你可以做一些像
lsof -i:1025 -Fp | sed 's/^p//' | xargs kill -9
此外,它对我不起作用,因为lsof
命令的输出是:
p4679
f33
因此,${x##p}
是
4679
f33
解决方案
仅抓取带有|头部的-n1
:
x=`lsof-Fp-i:“$1”| head-n1`
kill-9${x##p}
此外,根据@blm和@Mosh Feu的回答:
lsof -i:1337 -Fp | head -n 1 | sed 's/^p//' | xargs kill
是什么最终为我做的把戏
我建议将其添加为bash函数并对其进行别名
alias kbp='killByPort'
killByPort() {
lsof -i:$1 -Fp | head -n 1 | sed 's/^p//' | xargs kill
}
手册页上说:
-t specifies that lsof should produce terse output with process
identifiers only and no header - e.g., so that the output
may be piped to kill(1). -t selects the -w option.
您可以使用
lsof-t-i:1025 | xargs kill-9
什么是${x###p}
语法?我得到一个错误:kill:invalical pid:13013\nf22
@CobyBugstein${x##p}
是bash的模式匹配参数扩展语法。它匹配$x
中的模式p
,并删除最长出现的模式。在这种情况下,它匹配行首的p
,并将其删除。关于你的另一个问题,这是因为自从我写了我的答案后,lsof
发生了变化。我将编辑我的答案以注意这一点。谢谢!它似乎只适用于一个#
btwYes,lsof
在我写下答案后的某个时刻被更改为始终在以f
开头的行中包含文件描述符,无论您是否要求。我已经更新了我的答案,注意到。工作得很有魅力<代码>lsof-ti:1025也可以工作。