![종료 명령이 다른 명령과 병렬로 실행되면 세션이 종료됩니다.](https://linux55.com/image/100633/%EC%A2%85%EB%A3%8C%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EB%8B%A4%EB%A5%B8%20%EB%AA%85%EB%A0%B9%EA%B3%BC%20%EB%B3%91%EB%A0%AC%EB%A1%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%A9%B4%20%EC%84%B8%EC%85%98%EC%9D%B4%20%EC%A2%85%EB%A3%8C%EB%90%A9%EB%8B%88%EB%8B%A4..png)
이해할 수 없는 쉘 동작을 발견했습니다. 당신이 실행할 때
echo foo > /tmp/bar & exit
, 터미널이 폐쇄되었습니다. 하지만 실행하면
exit & echo foo > /tmp/bar
, 터미널은 다음과 유사하게 열려 있습니다.
[1] 4001
그것에 인쇄되어 있습니다.
다음을 사용하여 다른 계정 에 로그인하면 첫 번째 버전의 출력을 su
볼 수도 있습니다. su
다음과 같이 진행됩니다.
[2] 13777
exit
[1]+ Done exit
exit
첫 번째 명령이라면 세션이 종료되지 않는 이유는 무엇입니까?
Unix 시스템에서 이것을 재현할 수 없는 경우를 대비해 저는 Ubuntu 16.04를 사용하고 있습니다.
답변1
첫 번째 명령,
echo foo > /tmp/bar & exit
백그라운드에서 실행할 서브셸을 시작한 echo foo > /tmp/bar
다음 종료합니다(전경 셸). 간단히 입력하는 것처럼 터미널이 닫힙니다 exit
. 배경 셸은 오랫동안 유지되지 않으므로 경쟁이 발생하지 않습니다. 그러나 더 오래 실행되는 명령으로 이 작업을 수행하면 셸 및 옵션에 따라 다른 동작이 발생합니다.
sleep 60 & exit
종료되지 않을 수도 있지만 작업을 실행하고 있다고 불평합니다.
두 경우 모두 쉘은 양식의 한 줄을 인쇄 [1] 7149
하지만 터미널이 닫혀 있으면 이를 볼 시간이 없습니다.
두 번째 명령은
exit & echo foo > /tmp/bar
백그라운드에서 실행할 서브셸을 시작하고 exit
, 서브셸이 종료되고(서브셸에서) 실행됩니다 echo foo > /tmp/bar
. 따라서 "기본" 셸은 종료되지 않고 터미널은 계속 열려 있습니다.
[2] 13777
이어서
exit
(종료 쉘에 의해 인쇄됨)
[1]+ Done exit
(백그라운드 쉘이 종료될 때 메인 쉘에 의해 인쇄됩니다.)