我为这个函数创建了一个别名,以便在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功能以避免这种情况?
正如 Swoogan 在他的回答中所建议的那样,按名称终止进程的标准方法是使用killall。
至于您的kill_process函数,grep过滤的表达式ps将与自己的grep进程相匹配(您可以看到它在没有 的情况下运行管道awk),但在调用时kill,该进程不再运行。这就是您看到的消息。
每次运行该命令时,都会grep使用新的 PID 再次运行:这就是测试时在列表中找不到它的原因。
你可以:
ps,将其通过管道传输到文件或变量中,然后grepgrep从列表中过滤掉 PID(更简单)抑制kill输出:
kill $(...) 2>/dev/null
Run Code Online (Sandbox Code Playgroud)