【问题标题】:Bash function to kill processbash函数杀死进程
【发布时间】:2015-10-04 02:56:41
【问题描述】:

我为这个函数创建了一个别名,以便在 bash 中杀死进程:

在我的 .bashrc 文件中

  kill_process(){
    # $1 being a parameter for the process name
    kill $(ps ax | grep "$1" | awk '{print $1}')
}

alias kill_process=kill_process

所以,假设我想杀死meteor 进程:

让我们看看所有流星过程:

ps aux | grep 'meteor' | awk '{print $2}' 

21565
21602
21575
21546

使用别名调用kill_process函数

kill_process meteor

bash: kill: (21612) - No such process

所以,kill_process 函数有效地终止了meteor 进程,但它的kill 命令寻找一个不存在的 pid。请注意,ps aux | grep 没有列出 pid 21612有什么想法可以改进kill_process 函数来避免这种情况吗?

【问题讨论】:

  • 可能四个进程 ID 的原始列表之一是 grep 'meteor' 命令(因为它的调用行与模式 meteor 匹配)。 $(ps ax | grep "$1" | awk ...) 行生成的进程 ID 之一是 that grep 进程。但是当 pid 列表被提供给 kill 时,该 grep 进程已经停止。
  • 或者只使用pkill
  • 那个别名没有用。

标签: bash


【解决方案1】:

我认为在你的情况下 killall 命令会做你想做的事:

killall NAME

【讨论】:

  • +1 请注意,与上面的 sn-p 不同,这不是正则表达式匹配。它只会kill 具有确切名称的进程。
  • @uʍopǝpısdn 相反,当模式类似于p 时,使用模式匹配杀死是一种危险。
【解决方案2】:

正如 Swoogan 在他的回答中所建议的那样,按名称杀死进程的标准方法是使用 killall

至于您的kill_process 函数,过滤psgrep 表达式将匹配自己的grep 进程(您可以看到它在没有awk 的情况下运行管道),但到了@987654327 @ 被调用,该进程不再运行。这就是你看到的信息。

每次运行命令时,grep 都会以新的 PID 再次运行:这就是您在测试时无法在列表中找到它的原因。

你可以:

  1. 首先运行ps,将其通过管道传输到文件或变量中,然后运行grep
  2. grep的PID过滤出列表
  3. (更简单)抑制kill输出:

    kill $(...) 2>/dev/null
    

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多