전제조건 정보

전제조건 정보

나는 프로그램 실행을 위한 기본 스크립트를 보고 있었는데 dmenu_run, 그 중 내 관심을 불러일으킨 부분이 다음과 같습니다.dmenu

[..other stuff..] | dmenu | sh &

그래서 몇 가지 테스트를 해봤습니다.

전제조건 정보

저는 GNU/Linux를 실행하고 있습니다. 내 시스템
sh에 . dash내 로그인 쉘은 이며 bash터미널 에뮬레이터입니다. 테스트 중에 생성된 창의 PID로 바꿉니다 . 이것을 이용 해서 얻을 수 있습니다. 문제가 발생하지 않는 한 로그 출력이 생성되지 않는 것 같습니다. 테스트의 해당 부분을 수행하기 위해 실제로 로그 출력을 생성하는 다른 프로그램으로 대체할 수 있습니다.
stxterm
$XTERMPIDxtermxprop
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출력이 표시되는 이유는 무엇입니까 ? 어떻게 작동하나요?stxtermst

테스트 #2

(echo "echo xterm | sh &" | sh &) >/dev/null 2>&1i3blocks스크립트 에서 실행

i3-msg restarti3 또는 Super+Shift+R을 다시 시작할 때까지 유효합니다 . 창은 계속 존재하지만 실제 프로세스는 종료되고 창이 검은색으로 채워집니다.
자세한 내용은 이 버그 보고서를 참조하세요.https://github.com/vivien/i3blocks/issues/483

setsid -f xtermi3blocks스크립트 에서 실행

업무에는 문제가 없습니다

질문:

  • setsid -f이중 파이프가 sh할 수 없는 추가 작업이 있습니까 ? 왜 setsid -f그 장면에서는 작동하지만 다른 장면에서는 동일해 보이지만 i3blocks작동하지 않습니까 pstree?
  • setsidLinux 전용 명령인 것 같습니다. POSIX 호환 셸 및 coreutils만 사용하여 어떻게 복제할 수 있습니까?
  • 프로세스가 종료되면 창이 계속 표시되는 이유는 무엇입니까?

관련 정보