我想杀死包含一些字符串的所有进程。我写了这样做的脚本。但是,当我执行它时,它会在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>
可能的原因是什么,以及任何其他解决方案来实现我的目标?
答案 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.log
或vim 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>