echo в файл работает только с sudo su

echo в файл работает только с sudo su

Я использую плату разработки Jetson TK1 от NVIDIA, на которой установлена ​​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

и повторите для процессоров 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, лично, потому что это режет мне глаза, но в основном потому, что нам нужен скрипт, который может разбудить все процессоры, а затем выполнить команду для запуска нашей рабочей нагрузки. В идеале я бы поместил его в /etc/rc.local. Это не работает. Может быть, ядро ​​выключает процессоры после того, как rc.local выполняется при загрузке?

В любом случае, вот мой сценарий -

#!/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 активный ЦП. Вставка этих строк в терминал напрямую не работает. Это не было для меня загадкой. Я предположил, что я что-то напутал. Вот чтоявляетсяозадачивает. Выполнение команды, 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"

в моей пользовательской оболочке (пользователь sudoer) работает. Так что если я этого не сделаю sudo su, 1 никогда не будет отображен ни для одного из ЦП. Но отображение после sudo suдля одного ЦП позволяет мне отображать другие за пределами оболочки root.

Наконец, 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/ПроизводительностьВам также следуетecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

Связанный контент