ファイルへのエコーはsudo suでのみ機能します

ファイルへのエコーはsudo suでのみ機能します

私はUbuntu 14.04を搭載したNVIDIAのJetson TK1開発ボードを使用しています。これは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

スケジューラが十分な負荷を検出すると自動的に起動するはずですが、そうではありません(少なくとも私たちのワークロードでは)。回避策は、/sys 内の場所に「1」を書き込むことです。

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

ドキュメントには、以下のコマンドを順番に実行すると書かれています -

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

CPU2とCPU3でも繰り返します。これでうまくいきます。

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アクティブなCPUは1つだけ表示されます。これらの行をターミナルに直接貼り付けても機能しません。私にとっては、それが不可解な部分ではありませんでした。私は何かを間違えたのだと思いました。不可解です。 先ほど言ったように、コマンドを実行するsudo suecho機能します。ルートから抜けて

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 はどの CPU にもエコーされません。ただし、sudo su1 つの CPU に対して の後にエコーすると、ルート シェルの外部で他の 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と、書き込み部分は で行われsudoecho部分は自分のアカウントで行われるため、機能するはずです。なぜあなたのケースでは機能しなかったのかわかりません。

答え2

suスクリプトの先頭に を配置し、通常どおりコマンドを実行すると、問題なく動作します。sudo suの代わりにを使用する必要があるsudoのは、sudo はメイン プログラムでのみ動作し、リダイレクト ( >) はルート権限なしで実行されるためです。

答え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

関連情報