Eu tenho um script bash que é executado por meio da GUI (lightdm).
Em alguma linha durante o script, eu quero:
-
sudo service lightdm stop
- pare a GUI
- 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.