Закладка Shell, открытая через скрипт, зависает после того, как 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 

Обе эти команды зависят от настроек env (конфигурация chruby ), поэтому я ./zshrc файл ./zshrc перед запуском foreman .

Однако, если я запустил это, а затем попытаюсь выполнить Ctrl+C из долгого процесса – оболочка закончится, и я никогда не верну свое приглашение.

Примечание: запуск запуска мастера в новой оболочке в том же каталоге возвращает подсказку мне после 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% 

На данный момент я ничего не могу сделать – все игнорируется, и мне нужно закрыть вкладку.

  • Отключить не потребуется -h
  • команда чтения в ошибке zsh throws
  • Сводка использования диска для пользователя
  • Как я могу передать только stderr в zsh?
  • ZSH: В чем разница между `.` и` source`?
  • Папка псевдонимов исполняемых файлов с добавленным ключевым словом
  • Измените zsh-завершение, чтобы выполнить доработки над подсказкой
  • В чем разница между `autoload` и` autoload -U` в Zsh?
  • One Solution collect form web for “Закладка Shell, открытая через скрипт, зависает после того, как Ctrl + C запускает процесс”

    То, что вы наблюдаете, представляет собой сочетание двух вещей:

    1. Ctrl-C отправляет INT в группу процессов, а это означает, что не только ваш длительный процесс, но и процесс zsh, в котором он запущен, будет завершен одновременно (и у него не будет возможности перезапустить его).

    2. xfce4-terminal, не закрывает вкладку после завершения вашего процесса из-за флага -H:

    -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 + C вы просто будете убивать самих xeyes (то есть с помощью панели задач xkill или панели диспетчера окон), сеанс zsh начнется по назначению.

    Обходным путем для этого является перехват 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», чтобы закрыть вкладку, когда вы выходите из оболочки.

    Linux и Unix - лучшая ОС в мире.