Bash函数可以杀死进程

mit*_*tra 5 bash

我为这个函数创建了一个别名,以便在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
Run Code Online (Sandbox Code Playgroud)

所以,假设我想杀死这个meteor过程:

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

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

21565
21602
21575
21546
Run Code Online (Sandbox Code Playgroud)

kill_process使用别名调用该函数

kill_process meteor

bash: kill: (21612) - No such process
Run Code Online (Sandbox Code Playgroud)

因此,该kill_process函数有效地终止了meteor进程,但它的kill命令查找不存在的pid.请注意,pid 21612未列出ps aux | grep. 有什么想法改进kill_process功能以避免这种情况?

sle*_*ica 3

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

至于您的kill_process函数,grep过滤的表达式ps将与自己的grep进程相匹配(您可以看到它在没有 的情况下运行管道awk),但在调用时kill,该进程不再运行。这就是您看到的消息。

每次运行该命令时,都会grep使用新的 PID 再次运行:这就是测试时在列表中找不到它的原因。

你可以:

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

    kill $(...) 2>/dev/null
    
    Run Code Online (Sandbox Code Playgroud)