用于终止进程的Bash函数

用于终止进程的Bash函数,bash,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 因此,假设我想杀死流星进程: 让我们看看所有流星过程: 使用别名调用kill\u进程函数 因此,kill\u pro

为了杀死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
因此,假设我想杀死流星进程:

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

使用别名调用
kill\u进程
函数


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

我认为在您的情况下,killall命令可以满足您的要求:

killall NAME

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

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

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

你可以:

  • 首先运行
    ps
    ,将其导入文件或变量,然后运行
    grep
  • 从列表中筛选出grep的PID
  • (更简单)superss
    kill
    输出:

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

  • +1注意,与上面的代码片段不同,这不是正则表达式匹配。它只会
    kill
    具有确切名称的进程。@uʍopǝpısdn相反,当模式类似于
    p
    时,使用模式匹配进行kill是非常危险的。可能最初的四个进程ID列表中有一个是
    grep'meteor'
    命令(因为它的调用行与模式
    meteor
    )匹配。并且是由
    $生成的进程ID之一(ps ax | grep“$1”| awk…)
    行就是那个grep进程。但是当PID列表被赋予
    kill
    时,那个grep进程已经停止了。或者可能只是使用
    pkill
    。这个别名没有任何作用。
    killall NAME
    
    kill $(...) 2>/dev/null