我试图读取性能计数器并获取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/

10-10 01:11