Закладка 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% 

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

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

  • zsh скрипт успешно тестирует ssh или нет
  • Сериализовать переменную оболочки в bash или zsh
  • zsh не работает при завершении пути, когда команда vim
  • Предотвращение отключения терминала от убийства текущей работы в zsh
  • Как определить функцию, которая обрабатывает `command not found`?
  • Каков правильный способ сортировки связанного массива в bash или zsh?
  • Как я могу автозаполнять каждый параметр по-другому?
  • Функция Zsh с su и echo
  • Vim и унифицированные разности
  • Исключение кавычек в псевдониме zsh
  • Существуют ли какие-либо соглашения для имени глобальной переменной, которые содержат результат функции?
  • Linux и Unix - лучшая ОС в мире.