【问题标题】:How to access the PID from an lsof.如何从 lsof 访问 PID。
【发布时间】:2015-11-09 18:25:13
【问题描述】:

给定以下命令lsof -i:1025 我得到:

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 -9 12345

【问题讨论】:

    标签: bash terminal


    【解决方案1】:

    lsof(8) 手册页说:

       -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

    【讨论】:

    • 像魅力一样工作! lsof -ti:1025 也可以。
    【解决方案2】:

    类似:

    #!/bin/bash --
    
    x=`lsof -Fp -i:1025`
    kill -9 ${x##p}
    

    应该这样做。第 3 行运行 lsof 使用 -F 选项仅获取 pid,并带有前导 p。下一行从lsof 的输出中删除前导p,并将结果用作kill 命令中的pid。

    编辑:在某些时候,lsof 被修改,因此无论您是否要求,始终输出前面有 f 的文件描述符(这对我来说没有意义,但我知道什么)。虽然您可以将 | grep '^p' 放在反引号中,但更简单的方法是使用 -t 选项,如下面 fabianopinto 的回答所述。

    【讨论】:

    • ${x##p} 语法是什么?
    • 我收到一个错误:kill: illegal pid: 13013\nf22
    • @CobyBugstein ${x##p} 是 bash 的模式匹配参数扩展语法。它匹配$x 中的模式p 并删除它出现时间最长的地方。在这种情况下,它匹配行首的p 并将其删除。关于您的另一个问题,这是由于我写了答案后更改了lsof。我将编辑我的答案以说明这一点。
    • 谢谢!似乎只有一个# btw 也能正常工作
    【解决方案3】:

    还有来自@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
    }
    

    【讨论】:

      【解决方案4】:

      man lsof 表示您可以使用-F 指定要输出的字段以供其他程序处理。所以你可以做类似的事情

      lsof -i:1025 -Fp | sed 's/^p//' | xargs kill -9
      

      【讨论】:

        【解决方案5】:

        除了@blm's answer,它完全不适合我,因为lsof 命令的输出是:

        p4679
        f33
        

        所以${x##p}

        4679
        f33
        

        解决方案

        仅使用| head -n 1 获取first line

        x=`lsof -Fp -i:"$1" | head -n 1`
        kill -9 ${x##p}
        

        【讨论】:

        • 是的,lsof 在我写下答案后的某个时间点发生了更改,无论您是否要求,始终在以f 开头的行中包含文件描述符。我已经更新了我的答案以说明这一点。
        猜你喜欢
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 2017-05-02
        相关资源
        最近更新 更多