我试图读取性能计数器并获取IPC。我需要使用IPC来控制一些特定于机器的参数。我也在使用shell脚本。请参见下面的代码:
while true
do
retval=./perf periodic -e instructions -e cycles -s 50 -d -m td &
some_pid=$!
kill some_pid
if ["$retval" -gt "0.5"]
then
***something***
fi
sleep 1
done
我得到以下错误:
Algorithm.sh[27]: kill: some_pid: arguments must be jobs or process IDs
Algorithm.sh[27]: periodic: not found
Algorithm.sh[27]: [: missing ]
Algorithm.sh[27]: kill: some_pid: arguments must be jobs or process IDs
Algorithm.sh[27]: [: missing ]
Algorithm.sh[27]: periodic: not found
Algorithm.sh[27]: kill: some_pid: arguments must be jobs or process IDs
Algorithm.sh[27]: [: missing ]
有人能给我一些关于如何从perf指令中获取/返回值的指针吗。我尝试使用函数并返回值,但也失败了。
---------更新----------
现在我正在跟踪,一个问题解决了,剩下一个问题。
./perf periodic -e instructions -e cycles -s 50 -d -m td > result.txt &
另一个是
while true
do
retval=$(tail -n 1 result.txt)
echo $retval
if ["$retval" -gt "0.5"]
then
echo "Hello mate"
fi
sleep 1
done
echo给出了值,但是if语句没有被执行。它给出了以下内容:
Algorithm.sh[30]: [: missing ]
0.302430
Algorithm.sh[30]: [0.302430: not found
0.472716
Algorithm.sh[30]: [0.472716: not found
0.475687
Algorithm.sh[30]: [0.475687: not found
我查找了if条件语法,但没有发现错误。请帮忙。
最佳答案
这里有几个shell语法问题。
首先,retval=...
将把retval
变量设置为“=”右侧字符串的第一部分。然后,与号将作为整个事件的背景,基本上是将该值丢弃。你可能想:
retval=`./perf periodic -e instructions -e cycles -s 50 -d -m td`
将
perf
命令的输出存储到retval
中。但是,如果你把它放在带“&”的背景中,那就行不通了。您需要(a)同步运行它,而不使用上面显示的“&”;(b)将其输出重定向到一个文件中,并在完成后恢复它(您需要使用wait
来确定何时发生这种情况);或者(c)使用“协处理”(太复杂,无法在这里解释:请参阅bash手册页)。还有,你可能是说
kill $some_pid
?如果没有“$”,字符串"some_pid"
将作为文本参数传递给kill
,这可能不是您想要的。编辑
按照你的修改。。。shell通过将命令行拆分为单个令牌来操作。所以空间通常很重要。在这种情况下,shell标识的初始令牌将是
["$retval"
的组合值(在变量替换和引号移除之后)。删除引号后,最后一个标记将0.5]
。然后,在第一个调用行中,第一个标记是简单的“[”(可能retval
在第一次调用时是空的)。所以它抱怨最后一个标记不是匹配的']'。在其他迭代中,第一个标记是“[”加上$retval
中的附加数字文本,该文本没有提供有效的命令名。修复后,您将发现
-gt
运算符只计算整数比较。您可以使用bc(1)
命令。例如,如果1
大于0.5,此命令将产生$retval
的输出;否则0
。echo "$retval > 0.5" | bc
但请注意,您需要确保
retval
有一个有效的数值表达式,否则将导致bc
中的语法错误。然后需要捕获输出并将其放入条件中。这样的做法应该管用:if [ "$retval" ]
then
x=$(echo "$retval > 0.5" | bc)
if [ $x -eq 1 ]
then
echo "hello mate"
fi
fi
(注意,使用
$(...)
时,括号旁边不需要额外的空格。在赋值语句中,不能在x=foo
的两边有空格)关于linux - 连续将IPC(指令/周期)传递给其他功能或变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30608026/