加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 计算进程数并终止它们

发布时间:2020-12-15 21:31:52 所属栏目:安全 来源:网络整理
导读:我正在编写一个脚本来杀死同一进程的所有实例.由于它将在 Linux,AIX,HP-UX和Solaris上使用,我只需要使用内置的bash(sh)函数.这就是为什么killall,pkill等不适合我的原因. 一旦只有一个进程的实例,就应该以传统方式杀死它: kill -TERM `ps -ef | grep -v gre
我正在编写一个脚本来杀死同一进程的所有实例.由于它将在 Linux,AIX,HP-UX和Solaris上使用,我只需要使用内置的bash(sh)函数.这就是为什么killall,pkill等不适合我的原因.

一旦只有一个进程的实例,就应该以传统方式杀死它:

kill -TERM `ps -ef | grep -v grep | grep $process | awk '{print $2}'`

但是有时程序会运行额外的实例,这就是ps -ef |的原因…返回多个PID.这需要报告.

例:

bash-3.2$ps -ef | grep -v grep | grep perl | awk '{print $2}'
5267  
5268  
5269  
5270  
5271

我的想法是将这些值存储在临时变量中,然后在for循环中向每个值发送kill信号.

bash-3.2$tmp=`ps -ef | grep -v grep | grep perl | awk '{print $2}'`  
bash-3.2$echo $tmp  
5267 5268 5269 5270 5271

但是,如果发生这种情况,我仍然需要这些信息(存在多少个实例).
看来我需要检查存储在tmp变量中的整个字符串,并且可能计算空格?

无论如何,问题减少了如何检查$tmp变量存储多少个值?

解决方法

要获得最大 portability和可靠性,请使用-A(-IX的POSIX同义词)和使用-o而不是-f的自定义格式.

您对ps输出的过滤很脆弱:它可能与其他进程匹配.您必须排除grep进程,并且您可能还需要排除脚本,并且可能还有其他完全无辜的进程(例如您的脚本本身)被捕获,因为它们的命令行恰好包含$process as子串.尽可能严格地过滤.使用ps -o pid = -o comm =,只得到两列(PID和没有参数的命令),没有标题.

你不需要使用循环来执行查杀,kill接受多个参数.对于计数,让shell执行它:你有一个以空格分隔的数字列表,让shell执行单词拆分(使用$(…)外部引号)并计算结果字数($#).

count_and_kill_processes () {
  set -- $(ps -A -o pid= -o comm= |
           awk -v "name=$process" '$2 == name {print $1}')
  count=$#
  if [ $# -ne 0 ]; then kill "$@"; fi
}
count_and_kill_processes foo
# now the number of killed processes is in $count

如果您的shell在所有计算机上都是bash或ksh,则可以使用数组.

pids=($(ps -A -o pid= -o comm= |
           awk -v "name=$process" '$2 == name {print $1}') )
if [[ $# -ne 0 ]]; then kill "$@"; fi
# the number of killed processes is ${#pids}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读