스크립트 끝에 루프가 있으면 Bash `&`가 일관되지 않게 동작합니다.

스크립트 끝에 루프가 있으면 Bash `&`가 일관되지 않게 동작합니다.

Linux Mint 19를 부팅할 때 몇 가지를 실행하고 싶습니다. 따라서 MATE 터미널 창에서 script()를 사용하여 한 번에 모두 실행했습니다 ./get-to-work.

chromium-browser --start-maximized &
thunderbird &
code -n path/to/my/workspace &

좋은 결과. 스크립트를 시작하고 터미널 창을 닫았는데 세 가지 프로그램이 계속 실행되었습니다.

하지만 최근에는 5분마다 큰 노란색 창을 여는 줄을 추가했습니다(똑바로 앉도록 상기시키기 위해).

chromium-browser --start-maximized &
thunderbird &
code -n path/to/my/workspace &
for i in {1..1000}; do sleep 300 ; xterm -bg yellow -g 240x80 ; done

이제 이 스크립트를 시작한 터미널을 닫으면 스크립트는 여전히 실행 중이고 종료되며 노란색 팝업이 표시되지 않습니다. 이것은 실제로 제게는 기능입니다. 팝업이 팝업되기를 원하는 동안 터미널을 열어두었다가 예를 들어 화면을 공유할 때 닫습니다.

그러나 어떤 이유에서든 터미널을 닫고 스크립트를 종료하면 팝업 루프가 중지될 뿐만 아니라 이제 Chromium과 Thunderbird도 닫힙니다. VSCode( code)는 계속 열려 있습니다. 왜?

답변1

첫 번째 경우에는 어떻게 되나요?

스크립트를 실행하는 셸은 스크립트의 마지막 명령이 백그라운드로 전환된 직후에 종료됩니다. 쉘 프로세스는 스크립트에서 시작된 3개 프로그램의 상위 프로세스입니다. 이제 상위 프로세스가 종료되었으므로 PID-1 프로세스( init또는 systemd지금은 종종 종료됨)가 상위 프로세스가 됩니다.

터미널 프로그램이 더 이상 (그랜드) 상위 프로세스가 아니기 때문에 터미널과 스크립트에서 시작된 프로그램 간의 링크가 사라집니다.

두 번째 경우에는 어떻게 되나요?

마지막 백그라운드 프로세스 후에 스크립트는 활성 상태로 유지되어 루프를 실행합니다. 터미널이 종료되면 SIGHUP을 하위 프로세스로 보냅니다. 쉘은 하위 프로세스로서 이 신호를 하위 프로세스(프로그램)에 전파합니다.

프로세스가 HUP 신호를 수신할 때 기본 작업은 종료하는 것입니다. 분명히 VSCodeSIGHUP은 무시되거나 fork()상위 프로세스를 떠나므로 영향을 받지 않습니다.

관련 정보