Força um trabalho a entrar em primeiro plano quando solicitado pela entrada do usuário

2

Atualmente, estou trabalhando em um script de auditoria para uma plataforma enorme. No script principal nós usamos traps e em uma das armadilhas eu peço ao usuário para limpar os arquivos. O script não tem saída na saída padrão, portanto, executar o script na bg é óbvio.

Ao enviar um SIGQUIT para o bg-job ele para, e eu tenho que colocá-lo manualmente em primeiro plano com fg para obter o prompt.

O que eu tentei: Eu brinquei com set -m para o controle de trabalho ativo e coloquei um fg na minha função trap.

Com set -m meu shell próximo após o script terminar, sem ele eu recebo o debug-output, que meu script não tem controle de job. Mesmo com set -m , o trabalho não fica em primeiro plano.

Para isso, minhas perguntas são:

  • É possível forçar um trabalho a entrar em primeiro plano em algum momento?
  • Eu sei que essa não é a maneira comum de usar o controle de tarefas dentro de um script. O que é "melhor prática" para isso?
  • O job-control está dentro de um script apenas para sub-shells / child-processes ou posso usá-lo para controlar o trabalho que iniciei?

Editar: como lcd047 sugeriu, é muito mais elegante usar screen ou tmux , para manter os scripts limpos e simples.

    
por quenia 12.05.2015 / 09:53

1 resposta

3

Is job-control inside a script only for sub-shells/child-processes or can I use it to control the job I started?

Sim. É o shell pai que faz o controle de trabalho, você não pode colocar o processo filho em primeiro plano de dentro de si mesmo.

Editar: No entanto, você ainda pode fazer assim:

  • script filho:

    #! /bin/sh
    ...
    trap "kill -s USR1 $PPID" TTOU
    ...
    echo -n Cleanup?
    read yn </dev/tty
    ...
    
  • script pai:

    #! /bin/sh
    ...
    trap "fg %1" USR1
    ...
    child &
    ...
    wait
    ...
    

Isso instala um manipulador de sinal para SIGTTOU no filho e outro manipulador de sinal para SIGUSR1 no pai. Quando o filho tenta enviar algo para o terminal, ele recebe um SIGTTOU . Em seguida, ele envia um SIGUSR1 para o pai, que por sua vez executa fg %1 e coloca o filho em primeiro plano.

O acima assume %1 para ser o processo filho. Na prática, você provavelmente tem um único processo em segundo plano.

    
por 12.05.2015 / 10:14