다음은 대화형 셸의 프로세스 그룹이 셸의 작업이 아닌 두 가지 상황입니다.
$ sleep 100 &
[1] 16081
$ jobs
[1]+ Running sleep 100 &
$ disown %1
$ jobs
$
그리고
$ ( sleep 200 & )
$ jobs
$
프로세스 그룹이 더 이상 작업이 아니도록 각 사례를 어떻게 구현할 수 있습니까? 대화형 bash에서 프로세스가 쉘의 작업이 되기 위한 필요 충분 조건은 무엇입니까?
쉘은 의사 터미널 슬레이브에서 실행되는 세션 리더입니다. 쉘이 종료되면 위의 두 휴면 프로세스는 쉘의 작업 목록에 없으므로 영향을 받지 않으며 따라서 SIGHUP을 수신하지 않습니다. 그 다음에
두 휴면 프로세스 모두 여전히 의사 터미널 슬레이브 장치를 해당 세션의 제어 터미널로 갖고 있습니까?
정상적으로 종료하거나
kill
신호를 보내 잠자는 프로세스를 모두 종료하는 것 외에, 종료하기 위해 수행할 수 있는 다른 방법은 무엇입니까?
이 두 가지 시나리오가 실제 데몬의 효과와 어떻게 다른지 알고 싶습니다.
답변1
두 경우 모두 프로세스 그룹은 셸에서 작업을 시작합니다. 을 호출하면 disown %1
셸은 작업 목록에서 해당 항목을 제거합니다. 이것이 바로 모든 것입니다 disown
. ( sleep 200 & )
이 프로세스 sleep
는 괄호로 생성된 하위 쉘의 작업입니다. 를 실행하면 이를 확인할 수 있습니다 ( sleep 200 & jobs )
. 쉘이 종료되면 작업은 더 이상 쉘의 작업이 아니며 다른 모든 작업과 마찬가지로 하위 쉘의 작업은 자체 작업이며 상위 쉘에서는 이를 볼 수 없습니다.
프로세스는 동일한 세션에 유지되며 여전히 동일한 제어 터미널을 갖습니다. 이는 작업 제어와 관련이 없습니다.
다른 프로세스와 마찬가지로 종료하거나 신호를 수신하여 종료될 수 있습니다. 그들은 전경 프로세스 그룹의 구성원이 아니기 때문에(쉘이 그들을 다시 전경으로 가져오지 않기 때문에 그럴 수도 없습니다), 터미널이 사라지면 커널 생성 SIGHUP을 수신하지 않습니다.
프로세스 그룹은 쉘의 작업으로 시작되어 쉘의 작업으로 남아 있는 경우 쉘의 작업입니다. 어떤 명령이 별도의 작업이 되는지에 대한 세부 사항은 셸에 따라 다르며 이 답변의 범위를 벗어납니다. 즉, 쉘에 작업 제어가 활성화된 경우(쉘이 대화형인 경우 기본값) 각 복합 명령은 자체 작업입니다. 특히:
- 파이프라인은 단일 작업입니다.
- 명령 또는 프로세스 교체는 별도의 작업이 아니며 원래 프로세스 그룹 내에서 실행됩니다.
- 백그라운드에서 실행되는 모든 작업(
&
Ctrl+Z로 시작하든 백그라운드에서 실행하든)은 별도의 작업입니다.
disown
프로세스 그룹의 리더가 종료되거나, 쉘이 종료되거나, 쉘이 이를 삭제(사용)하면 프로세스 그룹은 더 이상 작업이 아닙니다.