상위 프로세스를 즉시 종료하고 하위 프로세스는 계속 실행 중입니다.

상위 프로세스를 즉시 종료하고 하위 프로세스는 계속 실행 중입니다.

나는 내 WM에서 매우 간단한 가난한 사람의 "실행 상자"/프로그램 실행 프로그램을 만들려고 합니다.

내 메뉴에는 다음이 있습니다.

"Run" f.exec "xterm -fg black -bg white -geometry 25x1 -T Run -e 'read input && exec $input' &"

이는 사용자 입력을 허용하는 멋진 작은 실행 대화 상자를 생성하지만 서브루틴이 실행되는 동안 계속 실행됩니다. 하위 프로세스는 즉시 종료되어야 할 때 시작됩니다.

처음에는 이것이 간단한 아이디어처럼 보였지만 지금은 fu가 제공하는 스크립트보다 훨씬 어려워 보입니다. 어떤 팁이 있나요?

편집: 다른 사람이 비슷한 일을 시도할 경우를 대비해 다시 돌아와서 내가 한 일을 게시할 것이라고 생각했습니다.

.twmrc의 TWM 메뉴 섹션

"Command" !"xterm -fg dimgrey -bg white -geometry 25x1+840+1150 -name run -title Run -e ~/scripts/getrun &"

그리고 getrun의 내용은

read -p "# " userinput
nohup $userinput >/dev/null 2>&1 &
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID

답변1

&질문에 대한 설명을 보면 명령줄의 끝이 원하는 것이 아닌 것 같습니다 . 이 경우 xterm을 백그라운드에 두고 스크립트를 계속 실행하지만 xterm 이후에는 실행할 것이 없습니다. &실행 쉼표 안에 닫는 따옴표를 넣을 수도 있습니다 . 그러나 xterm의 동작과 매개변수, TWM 작동 방식을 잘 모르기 때문에 작동한다고 보장할 수 없습니다. 작동하지 않으면 표준 셸에서 이를 수행하는 방법에 대한 예를 보여 드리겠습니다. 이는 별도의 스크립트를 통해 사용 중인 컨텍스트에 맞게 재현될 수 있습니다.

이를 테스트하고 구현하는 방법의 예로 /tmp/디렉터리에 두 개의 스크립트를 만들었습니다. 첫 번째 항목에는 runbg.sh예상되는 기능이 포함되어 있습니다.

#!/bin/sh

read cmdline
$cmdline &

/tmp/infiniteloop.sh예상대로 작동하는지 테스트하는 방법인 두 번째 스크립트는 각 반복마다 현재 날짜를 파일에 추가하는 절전 타이머가 포함된 무한 루프입니다 /tmp/infiniteloop.tmp.

#!/bin/sh

while true; do
  date >> /tmp/infiniteloop.tmp
  sleep 30
done

그런 다음 /tmp/runbg.sh명령을 실행하고 입력하면 /tmp/infiniteloop.sh셸로 돌아갑니다. infiniteloop.sh스크립트가 여전히 실행 중인지 확인할 수 있습니다 tail -f /tmp/infiniteloop.tmp. 모든 작업을 올바르게 수행했다면 30초마다 현재 날짜가 포함된 새 행이 표시됩니다.

따라서 귀하의 경우 별도의 쉘 스크립트를 작성하여 명령을 읽고 백그라운드에서 실행한 다음 TWM 메뉴 구성 파일에서 해당 스크립트를 호출하는 것이 좋습니다.

관련 정보