【问题标题】:bash script to collect pids in array用于在数组中收集 pid 的 bash 脚本
【发布时间】:2016-09-30 05:59:56
【问题描述】:

处理一个简单的 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 父 pids 然后迭代并尝试单独回显每个进程(本节将做更多工作,但它不起作用)。不幸的是,当我输出 $i 时,所有父 pid 都简单地连接在一起形成一个长字符串。如果我尝试输出一个特定的数组项,我会得到一个空输出。

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

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

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

提前致谢。

编辑:为了清楚起见,PID 屏幕的回显并不是最终所需的输出,它只是一种简单的方法来测试我是否得到了我所期望的。根据下面的评论,我相信 pgrep 类型的输出是首选输出。最后,我将一次将这些 pid 与原始进程绑定,以确保它是父进程,如果不是,我会吐出一个错误。

【问题讨论】:

  • 简单的PPIDs=($( ps -oppid= $(pgrep -f 'processname.*/etc/process/process.conf')))怎么样
  • 为什么你不知道在第 2 行使用 $(...),但你知道在第 6 行使用它?
  • @EdMorton 在第 2 行,我不想将值写入数组,只是获取符合我的条件的正在运行的进程数。
  • 我知道,但这与执行命令无关。使用反引号已过时,您应该在任何地方使用$(...) 语法。
  • 请注意,您应该简单地将 PPID 值分配给数组,然后检查数组中有多少元素,而不是两次运行 ps 管道(或对其进行次要变体)。

标签: arrays linux bash awk


【解决方案1】:

$i 不是一个串联数字,而是您的数组只是该串联数字的一个元素。这是因为awk 的输出被连接在一起,没有任何分隔符。

如果你只是在awk 中添加一个空格,你可能会得到你想要的:

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

或者更简单,使用print 而不是printf

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

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

【讨论】:

  • @JonathanLeffler 好点:我忽略了printfprint
猜你喜欢
  • 2017-04-18
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多