나는 프로그램 실행을 위한 기본 스크립트를 보고 있었는데 dmenu_run
, 그 중 내 관심을 불러일으킨 부분이 다음과 같습니다.dmenu
[..other stuff..] | dmenu | sh &
그래서 몇 가지 테스트를 해봤습니다.
전제조건 정보
저는 GNU/Linux를 실행하고 있습니다. 내 시스템
sh
에 . dash
내 로그인 쉘은 이며 bash
터미널 에뮬레이터입니다. 테스트 중에 생성된 창의 PID로 바꿉니다 . 이것을 이용 해서 얻을 수 있습니다. 문제가 발생하지 않는 한 로그 출력이 생성되지 않는 것 같습니다. 테스트의 해당 부분을 수행하기 위해 실제로 로그 출력을 생성하는 다른 프로그램으로 대체할 수 있습니다.
st
xterm
$XTERMPID
xterm
xprop
xterm
시험
시나리오 #1 - 실행 xterm
(또는 xterm &
) st
:
xterm이 로그인된 것을 볼 수 있습니다 st
.
pstree -s $XTERMPID
산출:systemd───sddm───sddm-helper───i3───st───bash───xterm───bash
종료 후st
xterm
살해당했습니다.
시나리오 #2 - 다음에서 실행 중 echo xterm | sh
(또는 echo xterm | sh &
) st
:
xterm
에서 로그를 볼 수 있습니다 st
.
pstree -s $XTERMPID
산출:systemd───sddm───sddm-helper───i3───st───bash───sh───xterm───bash
종료 후 st
:
xterm
어떻게든 살아남았다(이 부분이 이해가 안가는 부분이다. 아이들은 다 죽여야 하는 거 아닌가?)
pstree -s $XTERMPID
산출:systemd───xterm───bash
시나리오 #3 - 실행 setsid -f xterm
대상 st
:
너할 수 없다xterm
로그인을 참조하세요 st
.
pstree -s $XTERMPID
산출:systemd───xterm───bash
종료 후 st
:
예상대로.
시나리오 #4 - 다음에서 실행 echo "echo xterm | sh" | sh
(또는 echo "echo xterm | sh &" | sh &
) st
:
당신은 할 수아직xterm
로그를 확인 st
하지만 xterm
더 이상 의 하위 항목이 아닙니다 st
. 나도 이것을 이해하지 못한다.
pstree -s $XTERMPID
산출:systemd───sh───xterm───bash
종료 후 st
:
예상대로.
질문:
st
시나리오 #2에서 죽을 때 ,xterm
부모가sh
죽을 때 왜 죽지 않습니까?- 아니면
st
커널이 아이들을 죽이는 걸까요? - 직계 아이들만 죽이나요? 그렇다면 터미널을 닫을 때 터미널 쉘에서 실행 중인 프로그램이 종료되는 이유는 무엇입니까?
- 자식이 아닌데도 시나리오 #4에
xterm
출력이 표시되는 이유는 무엇입니까 ? 어떻게 작동하나요?st
xterm
st
테스트 #2
(echo "echo xterm | sh &" | sh &) >/dev/null 2>&1
i3blocks
스크립트 에서 실행
i3-msg restart
i3 또는 Super+Shift+R을 다시 시작할 때까지 유효합니다 . 창은 계속 존재하지만 실제 프로세스는 종료되고 창이 검은색으로 채워집니다.
자세한 내용은 이 버그 보고서를 참조하세요.https://github.com/vivien/i3blocks/issues/483
setsid -f xterm
i3blocks
스크립트 에서 실행
업무에는 문제가 없습니다
질문:
setsid -f
이중 파이프가sh
할 수 없는 추가 작업이 있습니까 ? 왜setsid -f
그 장면에서는 작동하지만 다른 장면에서는 동일해 보이지만i3blocks
작동하지 않습니까pstree
?setsid
Linux 전용 명령인 것 같습니다. POSIX 호환 셸 및 coreutils만 사용하여 어떻게 복제할 수 있습니까?- 프로세스가 종료되면 창이 계속 표시되는 이유는 무엇입니까?