echo to file 仅适用于 sudo su

echo to file 仅适用于 sudo su

我使用的是 NVIDIA 的 Jetson TK1 开发板,上面装有 Ubuntu 14.04。它是一个 4 核 ARM 系统,默认情况下,其中 3 个处于“离线”状态 -

ubuntu@tegra-ubuntu ~ $ lscpu
Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0
Off-line CPU(s) list:  1-3
Thread(s) per core:    1
Core(s) per socket:    3
Socket(s):             1

虽然它们应该在调度程序检测到足够的负载时自动唤醒,但它们并没有这样做(至少对于我们的工作负载而言)。解决方法是将“1”写入 /sys 内部的位置 -

/sys/devices/system/cpu/cpu1/online

文档说要按照以下步骤操作 -

sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online

并对 CPU 2 和 3 重复此操作。这有效 -

ubuntu@tegra-ubuntu ~ $ sudo su
[sudo] password for ubuntu: 
root@tegra-ubuntu:/home/ubuntu# echo 1 > /sys/devices/system/cpu/cpu1/online
root@tegra-ubuntu:/home/ubuntu# lscpu
Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0,1
Off-line CPU(s) list:  2,3
Thread(s) per core:    1
Core(s) per socket:    3
Socket(s):             1
root@tegra-ubuntu:/home/ubuntu# 

我个人不想使用sudo su,因为它伤害我的眼睛,但主要是因为我们需要一个可以唤醒所有 CPU 然后执行命令来启动我们的工作负载的脚本。理想情况下,我会把它放在/etc/rc.local。这不起作用。可能是内核在启动时执行 rc.local 后关闭了 CPU?

无论如何,这是我的脚本 -

#!/bin/bash
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu1/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
<some command>

问题是,<some command>上面的运行和 echo 行在 stdout 上没有任何结果。但是,lscpu只显示 1 个 CPU 处于活动状态。将这些行直接粘贴到终端中不起作用。这不是让我感到困惑的部分。我以为我搞砸了什么。以下是令人费解。正如我之前所说,执行sudo su以下echo命令即可。现在,退出 root 并运行

sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"

在我的用户 shell(用户是 sudoer)中有效。因此,如果我不执行sudo su,则 1 永远不会为任何 CPU 回显。但是,sudo su在一个 CPU 之后回显可以让我在 root shell 之外回显其他 CPU。

最后,tee像这样使用也不起作用-

echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online

sudo bash -c如果您能帮助我解释为什么会发生这种情况以及如何在用户终端的脚本中使用,我将不胜感激。

答案1

sudo echo 1 > /sys/devices/system/cpu/cpu0/online不起作用的原因是该sudo部分仅适用于主命令(echo 1);它不适用于重定向(> /sys/devices/system/cpu/cpu0/online),因此写入文件的部分是在您的用户帐户下完成的。

使用类似的东西echo 1 | sudo tee /sys/devices/system/cpu/cpu0/online应该可以工作,因为写作部分将在 下完成sudo,而echo部分将在您的帐户下。我不确定为什么它在你的例子中不起作用。

答案2

将其放在su脚本顶部,然后正常运行命令即可。您必须使用sudo su而不是 just 的原因sudo是因为 sudo 仅适用于主程序,重定向 ( >) 无需 root 权限即可运行。

答案3

嗯。这很奇怪。

这应该有效:

cat | sudo bash << "EOF"
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
EOF

也许其他东西对你有用,但是因为你没有禁用缩放调节器,所以它在你开始使用它们之前就关闭了核心?

根据http://elinux.org/Jetson/Performance你也应该echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

相关内容