백그라운드 프로세스의 하위 쉘 이상한 동작

백그라운드 프로세스의 하위 쉘 이상한 동작

비슷한 bash 명령이 왜 이렇게 작동하는지 궁금합니다.

Bash 스크립트가 있습니다 foo.

#!/usr/bin/env bash

while true
do
    echo "reading"
    read data
    echo $data
    echo "stderr msg" >&2
    sleep 1
done

이는 stdin에서 한 번에 한 줄씩 읽고 동일한 줄을 출력하는 무한 루프입니다. bash 스크립트도 있습니다 bar.

#!/usr/bin/env bash

./foo &

다음 명령은 bashUbuntu 18.04의 터미널(v.4.4.19)에서 실행됩니다(스크립트가 작업 디렉터리에 있다고 가정).

  1. ./foo &

    • 다음에 따라 표준 입력에서 읽으려고 하면 중지됩니다.이 답변.

    • 예상대로 제어 터미널이 종료되면 종료됩니다.

  2. (./foo &)

    • 새로운 입력은 표준 입력에서 자동으로 지속적으로 제공되는 것 같습니다. 표준 입력에서 읽으려고 할 때 멈춰야 하지 않나요? 무엇을 얻든 에코될 때 표시되지 않으므로 EOF 문자인 것으로 추측됩니다.

    • 제어 터미널이 종료된 후에도 계속 실행됩니다. 출력을 보려면 ps제어 터미널이 pts/에서 다음으로 변경됩니다.엑스도착하다? . or 를 사용하지 않고 disown어떻게 이런 일이 발생합니까 nohup? (그러나 원래 제어 터미널을 죽인 후 쓸 때마다 "쓰기 오류: 입출력 오류"가 발생하는데, 그 표준 출력이 이제 닫힌 터미널과 연결되어 있기 때문인 것 같습니다. 그렇죠?)

  3. bash -c "./foo &"

    동작은 2)와 정확히 동일한 것 같습니다.

  4. ./bar

    2), 3)과 정확히 같습니다.

  5. 시작 응용 프로그램으로 추가 bash -c "~/foo"(아니요 )&

    동작은 2), 3), 4)와 유사하지만 다음과 같은 차이점이 있습니다.

    • 제어 터미널은 데스크톱 tty입니다.엑스.
    • 당신은 제어 터미널을 죽일 수 없습니다.

    차이점은 나에게 놀라운 것이 아니며 단지 지속적으로 새로운 입력이 주입되고 있다는 것입니다.

내 생각에는 2) - 5) 모두 stdin이 비슷한 것으로 리디렉션되는 일종의 서브 쉘을 사용 /dev/null하지만 확실하지 않고 더 정확한 답변을 찾고 있습니다.

답변1

&쉘에서 실행할 명령아니요활성화된 작업 제어(예: 스크립트 또는 (...)하위 셸에서)의 표준 입력은 에서 /dev/null리디렉션 SIGINT되고 SIGQUIT로 설정됩니다 SIG_IGN. susv4에서기준:

작업 제어가 비활성화된 경우(참조 set) -m비동기 목록의 표준 입력은 명시적 리디렉션이 수행되기 전에 동일한 속성을 가진 파일에 할당된 것처럼 처리되어야 합니다 /dev/null. 작업 제어가 활성화된 경우에는 이런 일이 발생하지 않습니다. 모든 경우에 표준 입력의 명시적인 리디렉션이 이 활동을 재정의해야 합니다.

당신은 또한 볼 수 있습니다이것그리고이것.

귀하의 스크립트가 데이터를 "지속적으로 입력"하는 것이 올바르지 않습니다. ./foo읽으려고 할 때 EOF를 수신합니다. /dev/null확인해야 합니다 read.

답변2

하위 쉘은 비대화형입니다. 대화형 쉘만 자동으로 종료됩니다.

관련 정보