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

  • oh-my-zsh не может угадать правильную команду
  • zsh: команда map для массива
  • Режим vi не отображается корректно на новом терминале
  • Очистить или отключить псевдонимы в zsh
  • Разрешить все псевдонимы в командной строке zsh
  • Диапазоны массивов с пользовательским размером шага в оболочках Борна
  • При применении команд к группам строк из stdin
  • Восстановление опции в конце функции в zsh
  • Получить командную строку в завершении ZSH
  • В чем разница между тем, где и где
  • Список всех текущих файлов dotfiles с помощью zsh
  • Interesting Posts

    Использование синхронизации файлов только для сравнения имени файла, а не расширения

    Как настроить «дочерний» прокси-сервер, которому не нужен «родительский» прокси-сервер

    После обновления до Jessie управление сервисом не возвращает результат

    Сценарий Bash: элементы массива, содержащие пробельный символ

    Поиск библиотек, с которыми была связана библиотека,

    Как я могу анализировать сообщение SELinux SYSCALL?

    Обновите монетный двор из командной строки: «Не редактируйте этот файл вручную»

    Один хост, две виртуальные машины, которые не могут пинговать друг друга. Как решить

    Как скопировать файл несколько раз на случайно выбранные пути в файловой системе?

    Исключительно высокое использование shmem

    Как разрешен трафик устройства loopback?

    Как удалить корзину из загрузочного раздела

    Что происходит в UNIX / Linux, когда программа больше, чем размер памяти?

    Firefox заменяет неправильный запасной шрифт с нормальным весом

    Вставьте одинарные кавычки в текстовый файл для использования в качестве SQL-запроса, который следует за open-parens, используя sed

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