echo to file funciona apenas com sudo su

echo to file funciona apenas com sudo su

Estou usando a placa de desenvolvimento Jetson TK1 da NVIDIA que possui Ubuntu 14.04. É um sistema ARM de 4 núcleos e por padrão, 3 deles estão "offline" -

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

Embora devam ser ativados automaticamente quando o agendador detecta carga suficiente, eles não o fazem (pelo menos para nossa carga de trabalho). A solução alternativa é escrever um "1" em um local dentro de/sys -

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

A documentação diz para seguir estes comandos, em ordem -

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

e repita para cpus 2 e 3. Isso funciona -

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# 

Não quero usar sudo su, pessoalmente, porque machuca meus olhos, mas principalmente porque precisamos de um script que possa ativar todas as CPUs e então executar o comando para iniciar nossa carga de trabalho. Idealmente, eu colocaria isso em /etc/rc.local. Isso não funciona. Pode ser que o kernel desligue as CPUs após o rc.local ser executado na inicialização?

De qualquer forma, aqui está o meu script -

#!/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>

O problema é que <some command>as execuções e as linhas de eco acima não fornecem nada no stdout. No entanto, lscpumostra apenas 1 CPU ativa. Colar essas linhas diretamente no terminal não funciona. Essa não foi a parte intrigante para mim. Presumi que estraguei alguma coisa. Aqui está o queéintrigante. Fazer sudo suseguido do echocomando funciona, como disse anteriormente. Agora, saindo do root e executando

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

no meu shell de usuário (o usuário é sudoer) funciona. Então, se eu não fizer isso sudo su, 1 nunca será repetido para nenhuma das CPUs. Mas ecoar depois sudo sude uma CPU me permite repetir as outras fora do shell raiz.

Finalmente, teeusado assim também não funciona -

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

Qualquer ajuda sobre por que isso está acontecendo e como eu poderia usar sudo bash -cum script no terminal do usuário seria apreciada.

Responder1

O motivo sudo echo 1 > /sys/devices/system/cpu/cpu0/onlinede não funcionar é porque a sudoparte se aplica apenas ao comando principal ( echo 1); isso não se aplica ao redirecionamento ( > /sys/devices/system/cpu/cpu0/online) e, portanto, a parte de gravação no arquivo é feita na sua conta de usuário.

Usar algo como echo 1 | sudo tee /sys/devices/system/cpu/cpu0/onlinedeve funcionar, pois a parte escrita será feita em sudo, enquanto a echoparte estará em sua conta. Não sei por que não funcionou no seu caso.

Responder2

Colocar suno topo do script e depois executar os comandos normalmente funcionará perfeitamente. A razão pela qual você deve usar sudo suem vez de apenas sudoé porque o sudo só funciona no programa principal, o redirecionamento ( >) é executado sem privilégios de root.

Responder3

Huh. Isso é estranho.

Isso deve funcionar:

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

Talvez as outras coisas estivessem funcionando para você, mas como você não desativou o regulador de escala, ele desligou os núcleos antes de começar a usá-los?

De acordo comhttp://elinux.org/Jetson/Performancevocê também deveriaecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

informação relacionada