Shell 如何使用'ps'查找命令行?
我想找到CPU使用率最高的pid,我的脚本如下:Shell 如何使用'ps'查找命令行?,shell,command-line,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[或[^ 为什么?我如何修复它?因为您的ppid检索空值 更改命令以检索ppid值,如下所示 top -n 1 | sed -n 8p | awk -F " " '{print$2}' 发生的另一件事是顶部进程将立即结束 这是在我的
#!/bin/sh
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'`
echo $ppid
ps aux|grep $ppid
但我有一个错误:
grep:Unmatched[或[^
为什么?我如何修复它?因为您的ppid检索空值 更改命令以检索ppid值,如下所示
top -n 1 | sed -n 8p | awk -F " " '{print$2}'
发生的另一件事是顶部进程将立即结束
这是在我的Ubuntu14.04操作系统中。好的!我找到了!问题是top在它的输出中包含了终端控制序列。所以你实际上在echo中看不到它,但我注意到了,因为它将我的终端会话放在了粗体输出中,后来我试图弄清楚它是如何发生的,并将其追溯到我的测试中因此,grep抱怨的[是在ppid设置的转义序列中。我通过在awk之后添加
| tr-dc 0-9
找到了解决方法,即
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'|tr -dc 0-9`
这将删除结尾处不是数字的任何内容。但我认为,sed也需要调整。而且,我怀疑其中一些数字可能来自转义序列,因此您需要想出一种更干净的方法来删除转义序列
但是,归根结底,这将是非常无用的。每次我运行该管道时,CPU的最高用户都是它的
top
进程。回想起来,这可能并不奇怪。当所有其他操作都失败时,请检查输入:
$ 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更好地表达。然后我添加了第二个字段,以便我们可以看到发生了什么。)
结果是不确定的。top将突出显示已更改的行;为此,它将发出一个ANSI转义序列。如果捕获一个,您将捕获该序列--esc(Besc[mesc[1m--这在ps看来确实非常奇怪。该序列中的括号无疑会引发您的错误消息
为了解决这个问题,你的top可能有一个批处理模式。在我的top-n1-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.是否
$ppid
包含[
?它应该转义,因为它是一个特殊字符。我使用“echo$ppid”cmd,但只显示一些数字。这对我来说很有效(用于有限的测试)。如果ppid
不知何故设置为奇怪的内容,你应该在任何地方引用它(不管怎样,良好的标准做法)。也就是说,在grep
中,不要说echo$ppid
,也不要说echo“$ppid”
。顺便说一句,因为您只需对具有该数字序列的任何行进行grepping,您将看到任何具有pid的行,其中ppid是其子字符串,以及任何恰好在其参数中包含该数字的命令(例如,脚本正在运行的grep命令),或在任何其他ps aux
字段中。您可能希望使用sayawk
仅与行的正确部分进行比较。请参见下面的答案。您可能需要更复杂的echo“$ppid”|cat-v
以实际查看它。print$2仅获取用户,而不是pid print$1的输出是什么?如果是pid,则在回答$1中更改