É possível manter uma sequência de comandos em execução após o envio de ctrl + c na etapa intermediária?

2

Eu tenho um programa, vamos chamá-lo xcommand . quando está em execução, não possui stdout, mas grava sua saída em um arquivo.

O que eu quero alcançar é assim: Depois de rodar xcommand , durante a sua execução eu quero ver sua saída em tempo real, e se eu encontrar algo anormal, eu então desligo a saída e ao mesmo tempo tempo, traga de volta xcommand .

Eu tentei várias maneiras, por exemplo, no script bash que eu escrevo

xcommand &
tail -f outputfile
fg

No entanto, o problema é assim que pressiono ctrl+c , a coisa toda é interrompida. E fg não está sendo executado.

Então, é possível conseguir o que eu quero?

    
por user15964 03.05.2017 / 10:41

2 respostas

4

Quando não interativos (como em scripts), os shells não fazem controle de job. Eles não colocam trabalhos assíncronos em segundo plano. Aqueles permanecem no mesmo grupo de processos que o resto do script, então Ctrl-C fará com que um SIGINT seja enviado para eles também (assumindo que o script em si seja iniciado em primeiro plano).

Você pode emitir um set -m para o shell para fazer o controle do trabalho quando não interativo:

#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT

Para que isso funcione, esse script deve ser iniciado em primeiro plano. Também tome cuidado, pois se você pressionar Ctrl-Z ou se o trabalho em segundo plano tentar ler o terminal, você terá problemas.

Na minha experiência, esse tipo de truque só "funciona" em bash ou yash , geralmente não em outros shells parecidos com Bourne.

    
por 03.05.2017 / 11:26
0

Se você iniciar seu programa em segundo plano com

xcommand &

pressionando Ctrl + C no shell, não parará.

Se você, então, fizer

tail -f outputfile

e pressione Ctrl + C , somente o processo tail será finalizado.

Se você, então, fizer

fg

você colocará xcommand em primeiro plano. Agora, pressionar Ctrl + C terminará o processo xcommand .

Portanto, não coloque o processo xcommand em primeiro plano, ou, se fizer isso, pressione Ctrl + Z e siga com bg para colocá-lo de volta no plano de fundo.

    
por 03.05.2017 / 10:52