Quando é que o HUP deixou de ser enviado e o que posso fazer?

no tempo em que eu era jovem e o Unix era a coisa nova, criar um processo que não foi morto quando você saiu foi um desafio. Usámos o comando nohup para proteger os nossos processos persistentes do sinal HUP. Se não tivéssemos cuidado, os nossos processos seriam mortos quando nos desligássemos, ou mesmo fechássemos a concha de onde os iniciámos.

avança rapidamente para hoje e acho que estou surpreso que o padrão parece ser exatamente o oposto. Em ambos Ubuntu e Red Hat systems eu acho que eu posso colocar quase qualquer processo em segundo plano, matar a concha mãe, desligar, qualquer coisa e simplesmente continua. Eu vejo o mesmo comportamento com scripts Bash, scripts Python e programas C. Tenho o mesmo comportamento das sessões xterm ou ssh.

por exemplo numa janela xterm ou ssh, tipo:

while [ 1 ]; do date; sleep 10; done > /tmp/out &
Agora, a partir de outra janela, corre.
tail -f /tmp/out

Veja-o imprimir a data a cada 10 segundos, e depois feche a linha de comandos original com o Ctrl-D. Ainda a correr. Saia e volte a entrar. Ainda em execução.

Operações de concentração

Eu posso exibir o mesmo comportamento com um script Python ou um programa C. Dormir ou Não, Não importa. Por exemplo, este programa C feio comporta-se da mesma forma:

#include <stdio.h>

void main() {
    while(1) {
        printf("*\n");
        fflush(stdout);
        int i, j, k = 0;
        for(i=0; i < 10000; i++) {
            for(j=0; j < 100000; j++) {
                k += i * j;
            }
        }
    }
}
Isto é completamente contrário aos caminhos da minha juventude. Acho que não reparei quando mudou? Algum historiador sabe quando isto aconteceu? Será que {[3] } sequer é usado para este fim qualquer mais?

se de facto este é o estado actual das coisas, a minha pergunta é: Como posso fazer com que um processo morra quando o utilizador sai ou se desliga?

Tenho um hack que envolve vigiar a mudança do PID pai, mas certamente há algo mais elegante do que isso.

Author: GaryBishop, 2014-01-23

2 answers

Acho que estás à procura da opção shell. Você pode definir isso facilmente com
$ shopt -s huponexit

Alguns detalhes da página do homem bash:

A concha sai por defeito ao receber um avistamento. Antes a sair, uma shell interactiva Resende O suspiro a todas as tarefas, a correr ou parada. Os trabalhos interrompidos são enviados SIGCONT para garantir que eles recebem o suspiro. Para evitar que a shell envie o sinal para par- trabalho especial, deve ser removido da tabela de tarefas com o builtin deserdado (veja os comandos BUILTIN Shell abaixo) ou marcado para não receber SIGHUP usando disown-H.

Se a opção da linha de comandos huponexit tiver sido definida com o shopt, o bash envia um avistamento a todas as tarefas quando uma linha de comandos interactiva sai.

 5
Author: JimB, 2014-01-22 21:54:32
Ainda tenho um suspiro. Uma forma simples de testar:
#!/usr/bin/env sh

echo "$$"
trap "echo HUPPED $$ > /tmp/willithup" HUP
sleep 1000

Depois feche o emulador de terminal. Voltando à sua pergunta:

Vê-o imprimir a data a cada 10 segundos, e depois fecha o original a linha-mãe com o Ctrl-D. continua em execução. Saia e volte a entrar. Ainda execucao.

O processo não se dá quando o pai morre. Ele recebe um HUP quando perde a conexão com o terminal controlador ou quando é explicitamente enviado um HUP. Isto acontece por exemplo quando você sai do SSH.
Se não tivéssemos cuidado, os nossos processos morreriam quando nos registássemos. ou até fechamos a concha de onde os começámos.

Para o segundo: a concha em si Pode enviar um HUP a todos os seus filhos quando sair. No entanto, bash por exemplo tem huponexit definido como false por padrão. Pode muito bem ter sido isso que mudou. Note que, independentemente da opção huponexit, quando recebe um HUP, a shell também envia um HUP para todos os seus crianças.


Nas palavras de Stevens:

Uma sessão pode ter um único terminal de controlo. Este é geralmente o dispositivo de terminal (no caso de uma autenticação de terminal) ou pseudo-terminal dispositivo (no caso de um login de rede) no qual fazemos login.

Se um modem (ou rede) for detectado pelo terminal interface o sinal de suspensão é enviado para o processo de controlo (a líder da sessão).


Para além disso clarifique, o HUP inicial não é enviado pela shell. É enviado pelo condutor do terminal. Depois a concha "encaminha" para as crianças. Assim, de fato, um HUP enviado pelo motorista do terminal pode "cascata". Do TLPI:

Quando um processo de controlo perde a sua ligação terminal, o kernel envia-lhe um sinal para o informar deste facto. (Um sinal SIGCONT também é enviado, para garantir que o processo é reiniciado no caso de ter foi previamente interrompido por um sinal.) Tipicamente, isto pode ocorrer em dois circunstâncias:

  • quando o condutor do terminal detecta uma "desconexão", indicando uma perda de sinal num modem ou linha terminal.
  • quando uma janela do terminal está fechada numa estação de trabalho. Isto ocorre porque o último descritor de arquivo aberto para o lado Mestre do pseudoterminal associado com a janela de terminal está fechado.
 4
Author: cnicutar, 2014-01-22 23:14:43