프로세스를 실행하는 동안 Ctrl+C를 누른 후 스크립트를 통해 열린 셸 탭이 중단됩니다.

프로세스를 실행하는 동안 Ctrl+C를 누른 후 스크립트를 통해 열린 셸 탭이 중단됩니다.

다음 스크립트가 있습니다.

#!/usr/bin/env zsh
START_FOREMAN='/usr/bin/zsh -c "source /home/user/.zshrc; foreman start" zsh'
xfce4-terminal --tab -H -T app-server --working-directory=/home/user/git/app -e $START_FOREMAN

xfce4-terminal --tab -H -T api-server --working-directory=/home/user/git/api -e $START_FOREMAN

두 명령 모두 환경 설정(chrubyconfig) ./zshrc실행하기 전에 파일을 가져옵니다.foreman보석.

Ctrl+C그러나 이 명령을 실행한 다음 장기 실행 프로세스를 종료 하려고 하면 셸이 종료되고 프롬프트가 표시되지 않습니다.

참고: 동일한 디렉토리의 새 셸에서 foreman start를 실행하면 나에게 프롬프트가 반환됩니다 Ctrl+C.

./gradlew bootRun편집: 사람들은 감독 문제로 인해 괴로워하는 것 같지만 실행이나 장기 실행 프로세스와 관련 이 있기 때문에 그렇지 않다고 생각합니다 .

포먼은 확실히 그만 두었습니다.

^CSIGINT received
16:13:09 system       | sending SIGTERM to all processes
16:13:10 api.1 | exited with code 130

스프링 부트와 동일:

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:291)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at org.gradle.process.internal.streams.ExecOutputHandleRunner.run(ExecOutputHandleRunner.java:51)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
:bootRun FAILED
> Building 100%

지금은 할 수 있는 일이 없습니다. 모든 것이 무시되고 탭을 닫아야 합니다.

답변1

당신이 관찰하는 것은 다음 두 가지의 조합입니다.

  1. Ctrl-C는 INT를 프로세스 그룹으로 보냅니다. 이는 장기 실행 프로세스뿐만 아니라다루기 힘든실행 중인 프로세스는 동시에 종료됩니다(그리고 다시 시작할 기회도 없습니다).

  2. -H 플래그로 인해 xfce4-terminal은 프로세스가 끝난 후 탭을 닫지 않습니다.

-H, --hold 하위 명령이 종료된 후에도 터미널을 변경되지 않은 상태로 유지합니다.

이렇게 하면 매달린 것처럼 보입니다.

가장 간단한 테스트 케이스는 다음과 같습니다.

CMD=xeyes
START=$'/usr/bin/zsh -c \''$CMD$'; /usr/bin/zsh\''
xfce4-terminal --tab -H -T mycommand --working-directory=$HOME -e "$START"

이것을 활성화하면 "xeyes"가 누를 때까지 따라옵니다.Ctrl+C, 그 시점에서 닫히고 터미널이 정지된 것처럼 보입니다.

하지만 클릭하지 않으면Ctrl+Cxeyes 자체를 종료하면 됩니다(예: xkill 또는 창 관리자 작업 표시줄 사용).다루기 힘든세션이 예상대로 시작됩니다.

이 문제에 대한 해결책은 SIGINT를 가로채고 다음과 같이 셸을 다시 시작하는 것입니다.

CMD=xeyes
START=$'/usr/bin/zsh -c \'trap "exec /usr/bin/zsh" INT;'$CMD$'; exec /usr/bin/zsh\''
xfce4-terminal --tab -H -T mycommand --working-directory=$HOME -e "$START"

셸을 종료할 때 탭을 닫으려면 "-H"를 제거해야 할 수도 있습니다.

관련 정보