O processo filho continua a ser executado se o pai morre

2

Eu tenho um script bash que é executado por meio da GUI (lightdm).

Em alguma linha durante o script, eu quero:

  1. sudo service lightdm stop - pare a GUI
  2. Aceite um TTY (como tty1 ou tty7 ) usando, por exemplo, exec </dev/tty7 >/dev/tty7 2>&1
    (se agetty controla o TTY, podemos facilmente enviá-lo SIGSTOP ). tty7 é o preferido, já que, ao desligar lightdm , ele estará disponível.

O problema é que o script bash é filho do serviço lightdm .
Portanto, ao executar sudo service lightdm stop - ele tentará finalizar meu script / processo.

Descobri que preciso usar nohup , mas prefiro ter meu script já em execução / imune a SIGHUP .
Eu vi sugestões sobre disown e bg , mas um arquivo de script não está no modo interativo, portanto, não posso bg it. Também usando set -m não ajudará porque de qualquer forma eu preciso pressionar CTRL + Z para suspender meu processo (Enviar SIGTSTP irá suspendê-lo mas o arquivo ganhou) t continuar a correr ...).

Qual é o & confiável & abordagem robusta para resolver isso?
Usando o Ubuntu.

Atualização 8 de outubro 21:35 UTC - Respondendo a @countermode:

Eu tentei:

trap '' HUP
service lightdm stop

também tentou:

trap '' SIGHUP
service lightdm stop

Mas falhou. Eu sei que falhou porque depois da linha service lightdm stop eu escrevo para arquivos alguns dados. O tempo de modificação desses arquivos é muito antigo (um dia atrás), portanto, não funciona.

Eu tentei pegar todos os sinais que eu pensei que estava faltando, usando:

trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "trap_handler $sig" "$sig"
    done
}
trap_handler() {
    echo -e " \n Caught signal $1 \n" >>/path_to_some_folder/_signals.txt
}
echo "" >/path_to_some_folder/_signals.txt
signals_list=""
for i in {1..64} ; do
    signals_list+="$(kill -l $i) "
done
trap_with_arg trap_handler 0 $signals_list

service lightdm stop

Como é recomendado aqui .
Todos os sinais capturados são (à esquerda foi o primeiro): HUP , CONT , 0 .

Então eu tentei:

trap '' 0 HUP CONT
service lightdm stop

Mas também falhou ...

Atualização 9 de outubro às 08:46 UTC:

Na verdade, a resposta do @countermode funciona bem. Eu tive um pequeno erro no código, então achei que não funcionava.

    
por Dor 07.10.2016 / 16:33

1 resposta

2

Os scripts de shell podem definir seus próprios manipuladores de sinal usando a palavra-chave trap . Em seu cenário, você quer ignorar o SIGHUP, então você ligaria para algum lugar antes de terminar a sessão do ldm

trap '' SIGHUP

onde '' (a string vazia) indica que você deseja ignorar SIGHUP (você poderia especificar o código de tratamento de sinal aqui).

    
por 07.10.2016 / 17:33