Bash泛型“ps aux”过程由严格的名称

时间:2013-05-09 22:55:37

标签: bash generics awk ps

我正在尝试使用ps aux命令列出真正的ssh-agent进程。我注意到在某些发行版上,我会看到不需要的进程,比如命令颜色等等。我需要这样做,因为我需要确保真正的ssh-agent进程在脚本中运行(不要打扰,我已经有了一个循环...)。

所以我发现我需要在我的测试程序中使用类似的东西:

#!/bin/bash
ps aux | grep ssh-agent | grep -v grep | awk '{print $12}'

我的问题是:awk $ 12是否可以在任何使用bash版本的bash上使用任何unix / linux环境?

另外,如果我删除“grep -v grep”并执行此操作:

ps aux | grep ssh-agent | awk '{print $12}'

输出是:

ssh-agent
ssh-agent

现在:

ps aux | grep ssh-agent

输出是:

foo 18153478  0.0  0.0  536  844      - A      Apr 25  0:00 ssh-agent
foo 31260886  0.0  0.0  252  264  pts/0 A    22:38:41  0:00 grep ssh-agent

这意味着,“grep ssh-agent”之间的空格被awk命令解释为分隔符。 Aynthing有可能克服这个问题吗?我已经尝试过使用制表符分隔符,但事实并非如此。看起来命令的分隔符是简单的“空格”字符。是否可以为“ps”命令输出强制使用制表符分隔符?

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

首先$ 12与ps输出的字段数相关联。它与bash无关。

grep -v grep是删除grep进程的好方法,所以请将其保留;

现在你不确定最后一个字段是字段12还是什么,我不太确定

ps aux | grep ssh-agent | grep -v grep | awk '{ print $NF }' 

假设您只想查看ssh-agent(并且它没有命令行参数)

这里有一些快速而又脏的东西会吐出pid和完整的命令行

ps aux | grep ssh-agent | grep -v grep | awk '{ print $1 " "; for (k = 12; k < NF; k++ ) { printf "%s", k; } printf "\n"; }' 

NF是awk中的字段数,因此$ NF是最后一个字段。

看看这是否适合你。有更清洁的方法来做到这一点

答案 1 :(得分:2)

好吧我想我找到了它,非常简单明了:

ps -e -o pid,comm | grep ssh-agent

工作得很好。

在此处找到答案:https://unix.stackexchange.com/questions/22892/how-do-use-awk-along-with-a-command-to-show-the-process-id-with-the-ps-command/22895#22895

并改编为| grep ssh-agent

马丁也提出了建议。谢谢大家分享你的经验!

答案 2 :(得分:1)

我建议grep表示'[s]sh-agent'。这样您就无法获得grep本身。

我还建议不要使用awk(打印第12列),而是使用cut打印行的特定字符范围,例如: G:

ps aux | grep '[s]sh-agent' | cut -c 66-

这取决于ps的输出格式。

您可以改为查看/proc/文件系统:

(
  cd /proc
  for p in [0-9]*
  do
    [ "$(readlink $p/exe)" = "/bin/bash" ] &&
      echo "$p $(cat $p/cmdline | tr '\0' ' ')"
  done
)

(当然,使用......更合适而不是/bin/bash。)

另一方面,这将取决于/proc/文件系统的存在。决定自己哪个更适合你。