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