我想找到最高CPU使用率pid,我的脚本在这里:
#!/bin/sh
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'`
echo $ppid
ps aux|grep $ppid
但是我收到了错误:
grep: Unmatched [ or [^
为什么呢?我该如何解决?
答案 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。