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也可以工作。