for循环中的Bash脚本kill命令

时间:2016-07-31 17:20:58

标签: linux bash shell scripting

我想杀死包含一些字符串的所有进程。我写了这样做的脚本。但是,当我执行它时,它会在for循环的第一次迭代后得到“Killed”信号。这是我的代码:

#!/bin/bash

executeCommand () {
 local pname="$1";
 echo $HOSTNAME;
 local  search_terms=($(ps aux | grep $pname | awk '{print $2}'))
 for pros in "${search_terms[@]}";  do
     kill -9 "$pros"
     echo $pros
 done
exit
}

executeCommand "$1"  # get the string that process to be killed contains

我像./my_script.sh zookeeper一样执行它。 当我删除包含kill命令的行时,for loop执行直到结束,否则,在第一个kill命令之后,我得到输出“Killed”并退出程序。 / p>

可能的原因是什么,以及任何其他解决方案来实现我的目标?

2 个答案:

答案 0 :(得分:4)

执行此操作的愚蠢(错误,错误)方法是将grep -v grep添加到您的管道中:

# ${0##*/} expands to the name of the running script
# ...thus, we avoid killing either grep, or the script itself
ps aux | grep -e "$pname" | egrep -v "grep|${0##*/}" | awk '{print $2}'

更好的方法是使用为工作构建的工具:

# pkill already, automatically, avoids killing any of its parent processes
pkill "$pname"

也就是说,按名称匹配流程是一个不好的做法 - 你还会杀死less yourproc.logvim yourproc.conf,而不只是yourproc。不要这样做;相反,使用适当的过程监督系统(upstart,DJB daemontools,Apple launchd,systemd等)来监视长时间运行的守护进程,并在需要时杀死或重新启动它们。

顺便说一下 - 根本不需要for循环:kill可以在一次调用中传递多个PID,如下所示:

# a bit longer and bash-specific, but avoids globbing
IFS=$'\n' read -r -d '' -a pids \
  < <(ps auxw | awk -v proc="$pname" -v preserve="${0##*/}" \
      '$0 ~ proc && $0 !~ preserve && ! /awk/ { print $2 }' \
      && printf '\0')
kill -- "${pids[@]}"

......也可以表达为:

# setting IFS and running `set -f` necessary to make unquoted expansion safe
( IFS=$'\n'; set -f; exec kill -- \
  $(ps auxw | awk -v proc="$pname" -v preserve="${0##*/}" \
    '$0 ~ proc && $0 !~ preserve && ! /awk/ { print $2 }') )

答案 1 :(得分:-1)

grep将显示它自己的进程。它应该使用grep -v选项

删除

试试这个

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<nav class="navbar navbar-default navbar-fixed-top">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
       <a class="navbar-brand" href="#top">the company</a>
    </div>
    <div id="myNavbar" class="menu collapse  navbar-collapse">
    <ul class="nav navbar-nav navbar-right">
      <li class="scrollable"><a href="#about" class="active" class="scrollable">About me</a></li>
      <li class="scrollable"><a href="#portfolio">Portfolio</a></li>
      <li class="scrollable"><a href="#contact">Contact Me</a></li>
    </ul>
    </div>
  </div>
</nav>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>