A aba do shell aberta via script trava após o Ctrl + C no processo de execução

1

Eu tenho o seguinte script:

#!/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

Esses dois comandos dependem das configurações de env (configuração chruby ), por isso, eu obtenho meu arquivo ./zshrc antes de executar o arquivo. foreman gem.

No entanto, se eu executar isso e, em seguida, tentar Ctrl+C fora do processo de longa execução - o shell termina e eu nunca recebo meu prompt de volta.

Nota: a execução do foreman start em um novo shell no mesmo diretório retorna o prompt para mim depois de Ctrl+C .

Edit: Parece que as pessoas estão ficando presas no capataz, o que eu acredito que não é o caso, já que isso acontece com% color_de% ou qualquer processo de execução longa.

Foreman definitivamente sai:

^CSIGINT received
16:13:09 system       | sending SIGTERM to all processes
16:13:10 api.1 | exited with code 130

Assim como o boot Spring:

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%

Neste momento não há nada que eu possa fazer - tudo é ignorado e eu tenho que fechar a aba.

    
por Ash 24.10.2016 / 19:53

1 resposta

0

O que você observa é uma combinação de duas coisas:

  1. Ctrl-C envia INT para o grupo de processos, o que significa que não apenas o processo de longa duração, mas também o processo zsh em que está sendo executado, será finalizado simultaneamente (e não terá a chance de se reiniciar).

  2. xfce4-terminal, não fechará a guia depois que o processo terminar, devido ao sinalizador -H:

−H, −−hold Causes the terminal to be kept around after the child command has terminated

que faz parecer que está pendurado

Um caso de teste mais simples para isso pode ser algo assim:

CMD=xeyes
START=$'/usr/bin/zsh -c \''$CMD$'; /usr/bin/zsh\''
xfce4-terminal --tab -H -T mycommand --working-directory=$HOME -e "$START"

Se você iniciar isto, os "xeyes" estarão seguindo você, até que você pressione Ctrl + C , ponto em que eles serão fechados e seu terminal parecerá estar travado.

Mas se, em vez de clicar em Ctrl + C , você matar os próprios xeyes (ou seja, com um xkill ou uma barra de tarefas do gerenciador de janelas), uma sessão zsh comece como pretendido.

Uma solução para isso, é interceptar o SIGINT e reiniciar o shell, assim:

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"

Note que você também pode querer remover '-H', para fechar a aba, quando você sair do shell.

    
por 06.11.2016 / 20:53