次のスクリプトがあります。
#!/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
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つの組み合わせです。
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」を削除する必要があります。