如何使用`ps`查找命令行?

时间:2016-07-06 09:08:11

标签: shell command-line

我想找到最高CPU使用率pid,我的脚本在这里:

#!/bin/sh
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'`
echo $ppid
ps aux|grep $ppid

但是我收到了错误:

  

grep: Unmatched [ or [^

为什么呢?我该如何解决?

3 个答案:

答案 0 :(得分:1)

OK!我找到了!问题是top在其输出中包括终端控制序列。所以你实际上并没有在回声中看到它,但是我注意到因为它把我的终端会话变成了粗体输出,后来我试图弄清楚它是如何发生的,我追溯到我对这个问题的测试。所以,那个grep抱怨的是在ppid设置的转义序列中。我通过在awk之后添加|tr -dc 0-9来解决这个问题,即

ppid=`top -n 1 |sed -n 8p |awk '{print $1}'|tr -dc 0-9`

这将删除最后不是数字的任何内容。但我认为sed也需要调整。并且,我怀疑某些数字可能来自转义序列,因此您需要提供一种更清晰的方法来切除转义序列。

但是,归根结底,这将毫无用处。每次运行该管道时,CPU的最高用户是top进程,它是其中的一部分。回想起来,这可能不足为奇。

答案 1 :(得分:0)

因为你的ppid检索空值 更改命令以检索ppid值,如下所示

top -n 1 | sed -n 8p | awk -F " " '{print$2}'

发生这种情况的另一件事是顶级流程将立即结束

这是在我的ubuntu 14.04操作系统中。

答案 2 :(得分:0)

当其他所有方法都失败时,请检查输入:

$ top -n 1 | awk 'NR==8 {print $1 ": " $2}' | hexdump -C
00000000  1b 28 42 1b 5b 6d 1b 5b  31 6d 31 38 37 31 35 3a  |.(B.[m.[1m18715:|
00000010  20 6a 6b 6c 6f 77 64 65  6e 0a                    | jklowden.|
0000001a

(我缩短了你的命令。几乎所有结合了sed和awk的命令都可以用awk更好地表达。然后我添加了第二个字段,所以我们可以看到发生了什么。)

结果是不确定的。 顶部会突出显示已更改的行;为此,它会发出ANSI转义序列。如果您捕获一个,您将捕获该序列 - esc (B esc [m esc [1m - 这将是确实非常奇怪 ps 。该序列中的括号无疑会引发您的错误消息。

要解决此问题,您的顶级可能具有批量模式。在我的作品中,top -n 1 -b可以解决问题。

  

如何使用ps查找命令行?

我担心最好的答案是RTFM。 ps 是跨系统有很多变化的命令之一。我的GNU版本喜欢这个:

$ ps -c -f -p $(top -n 1 -b | awk 'NR==8 {print $1}')
UID        PID  PPID CLS PRI STIME TTY          TIME CMD
root      1300     1 TS   19 Jun30 ?        00:14:46 /usr/bin/python /usr/bin/la

其他观察:

  • 首选$()反对
  • 虽然这种方法适合学习,但要寻找不涉及解析交互式实用程序输出的解决方案。在手册中的帐户下,您将找到捕获更多信息的方法,而不仅仅是命令行,当前正好在

HTH。