用于收集数组

时间:2016-06-01 03:35:31

标签: arrays linux bash awk

使用一个简单的bash脚本,我可以用来最终告诉我一个流氓进程是否正在运行我们不想要的 - 这个最终将使用不同的父pid运行。各种监视器。我遇到问题的地方是将我想要的所有特定pid放入一个我可以执行某些操作的数组中。首先写剧本:

#!/bin/bash
rmanRUNNING=`ps -ef|grep /etc/process/process.conf|egrep -v grep|wc -l`

if [ $rmanRUNNING -gt 0 ]
 then
    rmanPPID=( $(ps -ef|grep processname|egrep -v grep|egrep -v /etc/process/process.conf|awk '{ printf $3 }') )
    for i in "${rmanPPID[@]}"
    do
        :
        echo $i
    done
fi

所以,目标是检查主进程的存在,这是运行配置文件的那个,第一个变量告诉我这个。接下来,如果它正在运行(基于大于0的计数),则意图是使用所有父pid填充数组,不包括将被确定为主进程的数组(我们不需要对此进行分析)。因此,在数组定义中,我们得到进程列表,grep进程名称,egrep -v grep输出,egrep -v“主”进程然后awk父pid然后迭代并尝试单独回显每个(在本节中将完成更多工作,但它不起作用)。不幸的是,当我输出$ i时,所有父pid都只是在一个长字符串中连接在一起。如果我尝试输出一个特定的数组项,我会得到一个空输出。

显然这里的问题是,我的数组定义有什么问题阻止它被声明为数组,或者其他一些奇怪的东西。

这是在测试环境的RHEL,6.2上,到生产时可能是7个。

完全披露,我是一名监控工程师,而不是SA - 绝对不是天生的bash脚本编写者!

提前致谢。

编辑:为了清晰起见,PID的屏幕回显不是最终的期望输出,它只是一种简单的方法来测试我正在回归我所期待的。基于下面的评论,我认为pgrep类型输出是首选输出。最后,我会将这些pid一次一个地绑回原始进程,以确保它是父进程,如果不是,我将吐出错误。

1 个答案:

答案 0 :(得分:3)

并不是$i将是一个连接数字,而且你的数组只是该连接数字的单个元素。这是因为awk的输出连接在一起,没有任何分隔符。

如果您只是在awk中添加空格,您可能会得到您想要的内容:

rmanPPID=( $(ps -ef|grep processname | ... | awk '{ printf "%d ", $3 }') )

甚至更简单,使用print代替printf

rmanPPID=( $(ps -ef|grep processname | ... | awk '{ print $3 }') )

(感谢Jonathan Leffler,请参阅下面的评论。)