Echo in Datei funktioniert nur mit sudo su

Echo in Datei funktioniert nur mit sudo su

Ich verwende das Jetson TK1-Entwicklungsboard von NVIDIA, auf dem Ubuntu 14.04 läuft. Es ist ein 4-Core-ARM-System und standardmäßig sind 3 davon „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

Obwohl sie automatisch aktiviert werden sollten, wenn der Scheduler genügend Last erkennt, tun sie das nicht (zumindest bei unserer Arbeitslast). Die Problemumgehung besteht darin, eine "1" an eine Stelle innerhalb von /sys zu schreiben -

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

In der Dokumentation heißt es, dass Sie diese Befehle in der angegebenen Reihenfolge ausführen sollen:

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

und wiederholen Sie dies für CPUs 2 und 3. Das funktioniert -

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# 

Ich persönlich möchte nicht verwenden sudo su, weil es meinen Augen wehtut, aber hauptsächlich, weil wir ein Skript brauchen, das alle CPUs aufwecken und dann den Befehl zum Starten unserer Arbeitslast ausführen kann. Idealerweise würde ich es in einfügen /etc/rc.local. Das funktioniert nicht. Vielleicht schaltet der Kernel die CPUs aus, nachdem rc.local beim Booten ausgeführt wurde?

Hier ist jedenfalls mein Skript -

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

Das Problem ist, dass <some command>die obigen Echozeilen nichts auf stdout ausgeben. Es wird jedoch lscpunur 1 aktive CPU angezeigt. Das direkte Einfügen dieser Zeilen in das Terminal funktioniert nicht. Das war für mich nicht der rätselhafte Teil. Ich nahm an, dass ich etwas vermasselt hatte. Hier ist wasIsträtselhaft. Doing sudo sugefolgt von dem echoBefehl funktioniert, wie ich bereits sagte. Nun, beenden Sie root und führen Sie

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

in meiner Benutzer-Shell (Benutzer ist sudoer) funktioniert. Wenn ich also nicht mache sudo su, wird 1 nie für eine der CPUs wiederholt. Aber das Echo nach sudo sufür eine CPU lässt mich die anderen außerhalb der Root-Shell wiederholen.

Schließlich teefunktioniert es auch nicht, so verwendet zu werden -

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

Ich bin für jede Hilfe dankbar, warum dies geschieht und wie ich es sudo bash -cinnerhalb eines Skripts im Benutzerterminal verwenden kann.

Antwort1

Der Grund, sudo echo 1 > /sys/devices/system/cpu/cpu0/onlinewarum es nicht funktioniert, liegt darin, dass der sudoTeil nur für den Hauptbefehl ( echo 1) gilt; er gilt nicht für die Umleitung ( > /sys/devices/system/cpu/cpu0/online), und daher wird das Schreiben in die Datei unter Ihrem Benutzerkonto ausgeführt.

Die Verwendung von etwas wie echo 1 | sudo tee /sys/devices/system/cpu/cpu0/onlinesollte funktionieren, da der Schreibteil unter erledigt wird sudo, während der echoTeil unter Ihrem Konto erfolgt. Ich bin nicht sicher, warum es in Ihrem Fall nicht funktioniert hat.

Antwort2

Wenn Sie am Anfang des Skripts einfügen suund dann die Befehle normal ausführen, funktioniert das einwandfrei. Der Grund, warum Sie sudo suanstelle von nur verwenden müssen sudo, ist, dass sudo nur mit dem Hauptprogramm funktioniert, die Umleitung ( >) wird ohne Root-Berechtigungen ausgeführt.

Antwort3

Huh. Das ist komisch.

Das sollte funktionieren:

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

Vielleicht haben die anderen Dinge bei Ihnen funktioniert, aber weil Sie den Skalierungsregler nicht deaktiviert haben, wurden die Kerne wieder ausgeschaltet, bevor Sie sie zu verwenden begannen?

Entsprechendhttp://elinux.org/Jetson/Performancedu solltest auchecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

verwandte Informationen