설명하다
명령이 포함된 동일한 루프는 chroot
터미널에서 실행될 수 있지만 쉘 스크립트에서는 실행될 수 없습니다.
생식
기본(또는 사용자의) rootfs 만들기
/mnt/myrootfs
다음 내용으로 파일을 생성
/mnt/myrootfs/tmp/hello.sh
하고 실행 가능하게 만듭니다.#!/bin/bash echo "i am exiting." exit
다음 스크립트(
./chroot-poll.sh
)를 생성합니다.#!/bin/bash while sleep 1; do echo "chrooting into the target..." sleep 1 sudo chroot /mnt/myrootfs /bin/bash --rcfile /tmp/hello.sh done
결과
콘솔 출력은 다음과 같습니다.
$ ./chroot-poll.sh
chrooting into the target...
i am exiting
chrooting into the target...
[1]+ Stopped ./chroot-poll.sh
왜 이것이 멈추나요? 전경으로 가져오면 fg
다시 반복되고 다시 중지됩니다.
터미널에서 실행하면 정상적으로 작동합니다.
./chroot-poll.sh
콘텐츠를 터미널에 직접 복사하여 붙여넣으면 예상대로 작동합니다.
$ while sleep 1; do echo "chrooting into the target..."; sleep 1 ; sudo chroot /mnt/myrootfs /bin/bash --rcfile /tmp/hello.sh; done
chrooting into the target...
i am exiting
chrooting into the target...
i am exiting
chrooting into the target...
i am exiting
chrooting into the target...
i am exiting
chrooting into the target...
^C
질문
스크립트의 내용은 터미널에서 실행할 수 있는데 스크립트 자체는 실행할 수 없는 이유는 무엇입니까?
답변1
이 질문에 제가 추가할 수 없는 것이 있습니다. 제 생각에는 이것이 본문과 관련이 있다고 생각합니다.
[1]+ Stopped ./chroot-poll.sh
&
백그라운드에서 프로세스를 실행할 때만 이와 같은 텍스트를 보았지만 문제의 여지가 없으며 백그라운드에서 작업을 실행하는 것에 대해서는 언급하지 않았습니다. 다른 사람들이 지적했듯이 오류를 재현할 수 없습니다.와는 별개로백그라운드에서 스크립트를 실행하면.
귀하의 스크립트를 실행하려고 할 때 귀하와 비슷한 결과를 얻는 대신 ./chroot-poll.sh &
귀하 ./chroot-poll.sh
가 백그라운드에서 실행하고 있다고 가정할 수 있습니다.
일반적으로 작업이 Stopped
들어와 백그라운드에서 실행되는 동안 표준 입력에서 데이터를 읽으려고 시도합니다. 이에 대한 매우 간단한 해결 방법은 다음과 같이 읽는 것입니다 /dev/null
.
./chroot-poll.sh < /dev/null
/dev/null
이렇게 하면 무엇이든 읽으려고 할 때 표준 입력이 아닌 stdin에서 읽습니다 .
나는 대화형 모드에서 bash를 실행하고 있기 때문에 결국 이런 일이 일어날 것이라고 믿습니다. 스크립트 실행을 요청하는 것이 아니라 덮어쓰기만 하면 됩니다 ~/.bashrc
. 비록 exit
bash는 여전히 프롬프트에 무언가를 입력할 것으로 예상하는 것처럼 stdin에서 데이터를 읽습니다. bash가 스크립트를 스크립트로 읽도록 하려면 다음을 사용하십시오.
sudo chroot /mnt/myrootfs /bin/bash -f /tmp/hello.sh