파일에 에코는 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

그리고 CPU 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주로 모든 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>실행되고 위의 에코 라인이 stdout에 아무 것도 제공하지 않는다는 것입니다. 그러나 lscpu활성 CPU는 1개만 표시됩니다. 이 줄을 터미널에 직접 붙여넣는 것은 작동하지 않습니다. 그것은 나에게 수수께끼의 부분이 아니었습니다. 나는 내가 뭔가를 엉망으로 만들었다고 생각했다. 다음은 무엇입니까?~이다수수께끼. 앞서 말했듯 sudo su이 명령을 실행하면 작동합니다 . echo이제 루트를 종료하고 실행 중입니다.

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어떤 CPU에서도 1이 에코되지 않습니다. 그러나 sudo su하나의 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 sujust 대신 사용해야 하는 이유 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/Performance너도 해야 해echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

관련 정보