서브셸 작업 설명

서브셸 작업 설명

Xorg를 테스트하기 위한 명령을 실행 (Xorg & sleep 3; xeyes) &하고 더 쉬운 관리를 위해 이를 단일 하위 셸 백그라운드 작업으로 그룹화했습니다. 이것은 잘 작동하며 3초 후에 새 Xorg 세션에서 xeyes를 엽니다.

명령을 실행하면 다음과 같은 출력이 표시됩니다.

[1] 635

check new process를 실행하면 ps -ef다음과 같은 출력이 표시됩니다.

root    635    361    0    4:52    tty1    00:00:00    -bash
root    636    365    0    4:52    tty2    00:00:00    /usr/lib/Xorg
root    639    365    0    4:52    tty1    00:00:00    xeyes

이것은 꽤 표준적인 출력인 것으로 보이며 예상한 대로입니다. 내 X 서버가 예상대로 작동하는지 확인한 후 kill %1이 명령을 실행한 후 내 프로세스는 다음과 같습니다.

root    636    1    0    4:52    tty2    00:00:00    /usr/lib/Xorg

Xorg를 종료할 수 없는 이유는 무엇입니까? 서브쉘이 성공적으로 종료되어 xeyes가 올바르게 닫히지만 Xorg를 가져오지 못하는 이유는 무엇입니까? 이제 Xorg의 상위 프로세스가 하위 쉘 대신 1이 되는 이유는 무엇입니까? 서브쉘이 종료 시 모든 하위 프로세스에 종료 신호를 보내면 안 됩니까?

또한 kill을 사용하여 그룹을 종료하면 kill 635(많은 리소스에서 이것이 동일해야 한다고 말합니다) kill %1프로세스 상태가 더욱 이상해집니다.

root    636    1    0    4:52    tty2    00:00:00    /usr/lib/Xorg
root    639    1    0    4:52    tty1    00:00:00    xeyes

무엇? ? ? 이제 두 프로세스 모두 종료할 수 없고 이제 둘 다 PID 1의 하위 프로세스인 이유는 무엇입니까? 무슨 일이야, 내가 뭘 잘못했나?

나에게 무엇을 해야 하는지 알려주는 것 외에도 여기서 정확히 무슨 일이 일어나고 있는지에 대한 심층적인 설명을 주시면 매우 감사하겠습니다.

답변1

작업 제어를 관찰하려면 프로세스 그룹 ID 및 세션 ID를 나열하는 옵션을 사용해야 합니다 -j.ps

여기에서 볼 수 있습니다:

[...]
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
chazelas  6805  4172  6805  6805  0 06:47 pts/7    00:00:00 /bin/zsh
chazelas  6825  6805  6825  6805  0 06:48 pts/7    00:00:00 xeyes
root      6826  6825  6826  6826  0 06:48 tty2     00:00:00 /usr/lib/xorg/Xorg :4
[...]

당신이 보고 있는 것은 내 쉘이 서브쉘의 프로세스보다 더 최적화되어 있고 서브쉘의 마지막 명령이기 때문에 서브쉘의 프로세스 내에서 실행되기 때문에 Xorg서브쉘입니다 . 아니요, 서브쉘은 종료 시 서브쉘을 종료하지 않으므로 쉘을 사용할 수 없게 됩니다(서브쉘이 교체되었기 때문에 사용할 수 없다는 것이 여기서 분명해졌습니다 ).xeyesbashxeyesxeyes

또한 bash:

$ ps -Afj
[...]
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
chazelas  7230  6805  7230  6805  0 06:54 pts/7    00:00:00 bash
chazelas  7246  7230  7246  6805  0 06:54 pts/7    00:00:00 bash
root      7247  7246  7247  7247  2 06:54 tty2     00:00:00 /usr/lib/xorg/Xorg :4
chazelas  7274  7246  7246  6805  0 06:54 pts/7    00:00:00 xeyes
[...]

bash종료되기를 기다리고 그 이후에는 아무것도 하지 않는 불필요한 추가 프로세스가 있습니다 xeyes. 그 외에는 에서와 동일합니다 . 쉘이 새 프로세스 그룹(6825 for , for ) zsh을 생성했지만 해당 프로세스 그룹에는 생성되지 않은 것을 볼 수 있습니다. .zsh7246bashXorg

&이는 서브셸 에서 Xorg시작된 명령이 새 작업에서 시작되지 않기 때문 이 아니라 Xorg해당 tty2 터미널을 연결하기 위해 자체적으로 완전히 새로운 세션(프로세스 그룹은 물론)을 시작하기 때문입니다.

따라서 Xorg프로세스 그룹에서 자신을 제거하면 프로세스 그룹 kill %1이 종료되지 않습니다.

kill %1과제이니 참고하세요프로세스 그룹, 단일 PID가 아닌. 프로세스 그룹에 신호를 보내려면 다음을 수행해야 합니다.

kill -- -7246

위의 예에서는 pid 7246(bash 하위 쉘) 및 7274( xeyes) 가 종료되지만 Xorg(7247)은 7246 프로세스 그룹에 속하지 않기 때문에 종료되지 않습니다.

관련 정보