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>上面的運行和回顯行不會在標準輸出上給出任何內容。但是,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,任何 CPU 都不會回顯 1。但對一個 CPU 進行回顯sudo su可以讓我在 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

相關內容