
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
서브쉘입니다 . 아니요, 서브쉘은 종료 시 서브쉘을 종료하지 않으므로 쉘을 사용할 수 없게 됩니다(서브쉘이 교체되었기 때문에 사용할 수 없다는 것이 여기서 분명해졌습니다 ).xeyes
bash
xeyes
xeyes
또한 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
을 생성했지만 해당 프로세스 그룹에는 생성되지 않은 것을 볼 수 있습니다. .zsh
7246
bash
Xorg
&
이는 서브셸 에서 Xorg
시작된 명령이 새 작업에서 시작되지 않기 때문 이 아니라 Xorg
해당 tty2 터미널을 연결하기 위해 자체적으로 완전히 새로운 세션(프로세스 그룹은 물론)을 시작하기 때문입니다.
따라서 Xorg
프로세스 그룹에서 자신을 제거하면 프로세스 그룹 kill %1
이 종료되지 않습니다.
kill %1
과제이니 참고하세요프로세스 그룹, 단일 PID가 아닌. 프로세스 그룹에 신호를 보내려면 다음을 수행해야 합니다.
kill -- -7246
위의 예에서는 pid 7246(bash 하위 쉘) 및 7274( xeyes
) 가 종료되지만 Xorg
(7247)은 7246 프로세스 그룹에 속하지 않기 때문에 종료되지 않습니다.