echo para arquivo funciona apenas com sudo su

1

Estou usando a placa de desenvolvimento Jetson TK1 da NVIDIA que tem o Ubuntu 14.04. É um sistema ARM de 4 núcleos e, por padrão, 3 deles sã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

Enquanto eles devem acordar automaticamente quando o agendador detecta carga suficiente, eles não o fazem (pelo menos para nossa carga de trabalho). A solução é 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 os processadores 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# 

Eu não quero usar sudo su , pessoalmente, porque dói meus olhos, mas principalmente porque precisamos de um script que possa acordar todas as CPUs e depois executar o comando para iniciar nossa carga de trabalho. Idealmente, eu colocaria em /etc/rc.local . Isso não funciona. Pode ser que o kernel desligue os processadores 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> é executado e as linhas de eco acima não fornecem nada no stdout. No entanto, lscpu mostra apenas 1 CPU ativa. Colando estas linhas no terminal diretamente não funciona. Essa não foi a parte intrigante para mim. Eu assumi que estraguei alguma coisa. Aqui está o que é confuso. Fazer sudo su seguido do comando echo funciona, como eu disse anteriormente. Agora, saindo do root e rodando

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. Portanto, se eu não fizer sudo su , 1 nunca será ecoado para nenhuma das CPUs. Mas ecoar depois de sudo su para uma CPU me permite ecoar as outras pessoas fora do shell da raiz.

Finalmente, tee usado 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 -c de dentro de um script no terminal do usuário seria bem-vinda.

    
por maverick1989 11.07.2015 / 02:45

3 respostas

1

Colocar su na parte superior do script e, em seguida, executar os comandos normalmente funcionará muito bem. A razão pela qual você tem que usar sudo su ao invés de apenas sudo é porque o sudo só funciona no programa principal, o redirecionamento ( > ) é executado sem privilégios de root.

    
por Kookerus 11.07.2015 / 03:41
0

O motivo sudo echo 1 > /sys/devices/system/cpu/cpu0/online não funciona porque a parte sudo se aplica apenas ao comando principal ( echo 1 ); ele 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/online deve funcionar, já que a parte da redação será feita em sudo , enquanto a parte echo estará na sua conta. Não sei por que não funcionou no seu caso.

    
por saiarcot895 11.07.2015 / 03:22
0

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, os núcleos foram desativados antes de você começar a usá-los?

De acordo com o link , você também deve echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

    
por Stephen 11.07.2015 / 03:04