다음 스크립트가 있습니다.
#!/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
두 명령 모두 환경 설정(chruby
config) ./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
당신이 관찰하는 것은 다음 두 가지의 조합입니다.
Ctrl-C는 INT를 프로세스 그룹으로 보냅니다. 이는 장기 실행 프로세스뿐만 아니라다루기 힘든실행 중인 프로세스는 동시에 종료됩니다(그리고 다시 시작할 기회도 없습니다).
-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"를 제거해야 할 수도 있습니다.