설명하다

설명하다

설명하다

명령이 포함된 동일한 루프는 chroot터미널에서 실행될 수 있지만 쉘 스크립트에서는 실행될 수 없습니다.

생식

  1. 기본(또는 사용자의) rootfs 만들기/mnt/myrootfs

  2. 다음 내용으로 파일을 생성 /mnt/myrootfs/tmp/hello.sh하고 실행 가능하게 만듭니다.

    #!/bin/bash
    echo "i am exiting."
    exit 
    
  3. 다음 스크립트( ./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. 비록 exitbash는 여전히 프롬프트에 무언가를 입력할 것으로 예상하는 것처럼 stdin에서 데이터를 읽습니다. bash가 스크립트를 스크립트로 읽도록 하려면 다음을 사용하십시오.

sudo chroot /mnt/myrootfs /bin/bash -f /tmp/hello.sh

관련 정보