プロセスの実行中に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

Spring Bootと同じ:

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

あなたが観察するのは、次の2つの組み合わせです。

  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」を削除する必要があります。

おすすめ記事