터미널 외부에서 프로그램 실행

터미널 외부에서 프로그램 실행

대화형으로 파일을 요청하고 GUI 프로그램을 사용하여 파일을 열기 위해 터미널을 열려고 합니다.

foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &)'

그렇지 않으면 터미널이 종료될 때 setsid터미널을 삭제하기 때문에 사용하고 있습니다 . xdg-open그러나 위 명령은 작동하지 않습니다. 화면에 아무 것도 표시하지 않고 계속 종료됩니다. 그런데 sleep마지막에 하나 추가 하면하다일하다:

foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &); sleep 0.0000000001'

터미널은 종료되지만 시작된 프로세스는 xdg-open계속 실행 중입니다.

여기서 무슨 일이 일어나고 있는 걸까요? 잠을 피하는 더 깔끔한 방법이 있습니까? (정확한 잠의 타이밍은 시스템에 따라 다르다고 가정하기 때문입니다.)

을 사용해 보았 disown으나 전혀 작동하지 않습니다(작동하더라도 sleep).

답변1

백스테이지 과정:

  1. 터미널에서 분리( setsid);
  2. 달리다 xdg-open.

1단계가 완료되기 전에 터미널이 사라지면 프로세스 그룹 전체가 SIGHUP을 받고 종료된다. SIGHUP이 도착하는 것을 방지하지만 setsid작업을 완료하기 전에 (또는 호출하는 서브셸)이 종료되면 xdg-open도움이 되지 않습니다 .setsidsetsidsetsid

수정 사항은 포그라운드의 SIGHUP에서 분리하는 것입니다.

foot /bin/sh -c 'file=`fzf`; setsid sh -c "xdg-open \"\$1\" &" sh "$file"'

또 다른 해결책은 SIGHUP을 무시하는 것입니다.

foot /bin/sh -c 'file=`fzf`; trap "" SIGHUP; xdg-open "$file" &'

관련 정보