Para um shell padrão (bash) (POSIX.1)
Comece com &
, faça-o ler algo diferente do padrão stdin
(== /dev/tty
== /dev/stdin
== /dev/fd/0
) + faça com que ele grave algo diferente do% padrãostdout
(== /dev/tty
== /dev/stdin
== /dev/fd/1
) (o mesmo para stderr
) e certifique-se de que o trabalho não seja ou não seja suspenso (= parado ). Se for interrompido ou precisar ler o terminal e continuar após o terminal do trabalho desligar, certifique-se de que os processos no trabalho tenham um manipulador (trap) para o sinal SIGHUP . Se ele precisar gravar no terminal e sobreviver a um terminal, certifique-se de que os processos que gravam no terminal tenham um manipulador para SIGPIPE .
Explicação:
Os processos em segundo plano são enviados SIGTTIN no momento em que eles tentam ler a partir do terminal. A disposição padrão para SIGTTIN é parar (= suspender) o processo. Um desligamento de terminal fará com que a primeira geração de processos de seus trabalhos em segundo plano sejam reparados no init, fazendo com que o grupo de processos da primeira geração de processos do seu trabalho se torne um grupo de processos órfãos. (Grupos de processos órfãos são aqueles em que nenhum dos membros tem um pai em um grupo de processos diferente, mas na mesma sessão.) O sistema enviará todos os grupos de processos órfãos (suspensos) parados SIGHUP seguidos por SIGCONT (para garantir que eles obtenham o SIGHUP ) em um desligamento terminal porque, por definição, nenhum dos processos nesse grupo de processos pode ser despertado por um pai da mesma sessão. Consequentemente, esses processos devem ser despertados pelo sistema, mas, ao mesmo tempo, de uma forma que sinalize que o processo foi despertado devido ao desligamento do terminal, e não devido à operação normal. SIGHUP é o mecanismo que faz isso e a disposição padrão para SIGHUP é abortar.
Desligar um terminal também fará com que gravações subsequentes nesse terminal aumentem SIGPIPE , que também é mortal se não for manipulado.
TL; DR
Se seus grupos de processos órfãos não estiverem suspensos (via SIGTTIN ou ^ Z ou de outra forma, eles não precisarão ficar com medo do SIGHUP sinal e se enviarem para um arquivo em vez do terminal em stdout
e stderr
e lido de um arquivo em vez do terminal, então eles não precisam ter medo de SIGPIPE .
Se você estiver executando em cima de um multiplexador de terminal em vez de um terminal bruto, você não precisa ter medo de SIGHUP ou SIGPIPE .
para zsh
Eu joguei com zsh
e acontece que enquanto bash
se comporta como eu descrevi acima (o comportamento descrito acima deve estar em conformidade com POSIX.1), zsh
envia SIGHUP para executar trabalhos em segundo plano.
setopt NO_HUP
faz isso (ou o sistema; não tem certeza aqui) só envia SIGHUP
nas situações descritas acima.
Para testar isso, você pode tentar executar algo como:
( rm -f hup; trap 'echo HUP > hup' HUP; sleep 100)
de várias formas ( fundo, primeiro plano, parado ) e desconectando-se com ele. Em seguida, você pode verificar se o arquivo hup
foi criado, o que significaria que o trabalho obteve um SIGHUP .