将 IPC(Instructions/Cycles) 连续传递给其他函数或变量

Passing IPC(Instructions/Cycles) continuously to other function or variable

我正在尝试读取性能计数器并获取 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 ]

谁能给我一些关于如何 get/return 来自 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) 使用 "coprocess"(在这里解释太复杂:参见 bash 手册页)。

另外,您的意思可能是 kill $some_pid?如果没有 '$',字符串 "some_pid" 将作为文字参数传递给 kill,这可能不是您想要的。

编辑

根据您的修改... shell 通过将命令行拆分为单独的标记来运行。所以 spaces 通常很重要。在这种情况下,由 shell 标识的初始标记将是 ["$retval" 的组合值(在变量替换和引号删除之后)。删除引号后,最后一个标记将是 0.5]。然后在第一个调用行中,第一个标记只是“[”(大概 retval 第一次是空的)。所以它抱怨最后一个标记不是匹配的']'。在其他迭代中,第一个标记是“[”加上来自 $retval 的附加数字文本,它没有提供有效的命令名称。

修复该问题后,您会发现 -gt 运算符仅计算整数比较。您可以使用 bc(1) 命令。例如,如果 $retval 大于 0.5,此命令将产生 1 的输出;否则 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

(请注意,对于 $(...),您 不需要 括号旁边的其他 space。在赋值语句中 x=foo,你必须 而不是 = 的两边有一个 space。)