【问题标题】:Passing a port number to lsof in a shell function在 shell 函数中将端口号传递给 lsof
【发布时间】:2016-06-01 22:52:10
【问题描述】:

我在我的 bash 配置文件中写了一个别名来帮助我杀死没有完全关闭的流氓 Rails 服务器进程。这个别名很好用。

alias kill3000="lsof -i tcp: 3000 -t | xargs kill -9 | echo 'killed processes on port 3000'"

我想让它更通用,适用于在其他端口上工作的框架。我试图做一个类似的函数,所以我可以将端口号作为变量传递,但我得到了一个错误。我写的函数是这样的……

function killproc (){
    "lsof -i tcp:$1 -t | xargs kill -9 | echo 'killed processes on port $1'"
}

但是,当我运行“killproc 3000”时,出现以下错误:

lsof: unacceptable port specification in: -i tcp:

我很难理解这个问题,感谢任何帮助。

【问题讨论】:

  • 引用整行 "lsof -i ... killed ..$'" 看起来很可疑。还要调试情况,学习使用set -vx ; ... cmd .... ; set +vx 来查看shell 如何解释您的代码。以+ 开头的行显示所有变量值。所有" dbl 引用的字符串都“标准化”为' 单引号字符串。祝你好运。
  • 谢谢,set -vx 对发现问题很有帮助。该变量在重复,因此它正在寻找端口 3000 3000,这导致了错误。我不确定为什么会发生这种情况,但是运行exec bash 为我解决了这个问题。感谢您的帮助!

标签: macos shell unix terminal lsof


【解决方案1】:

可能涉及到双引号。

试试这个:

function killproc (){
    lsof -i tcp:"$1" -t | xargs kill -9
    lsof -i tcp:"$1" -t 2>/dev/null >/dev/null || printf "killed processes on port %s\n" "$1"
}

仅当在指定的端口 p 上找不到更多进程侦听时,才会打印该消息。

如果遇到问题,请按照@shellter 说明进行操作。 使用set -vx ; killproc 300 ; set +vx 运行测试并编辑问题以添加生成的输出。

【讨论】:

  • 谢谢您的回答(和@shellter 的评论)帮助我解决了这个问题。我的变量重复了,所以3000 变成了3000 3000。不知道为什么,但是用exec bash 刷新环境解决了它。你的功能很好用。
猜你喜欢
  • 2023-03-09
  • 2015-10-09
  • 2015-05-05
  • 2020-09-12
  • 2018-02-05
  • 2016-03-06
  • 2011-11-18
  • 1970-01-01
  • 2015-03-31
相关资源
最近更新 更多