AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 691656
Accepted
user356126
user356126
Asked: 2022-02-22 19:07:45 +0800 CST2022-02-22 19:07:45 +0800 CST 2022-02-22 19:07:45 +0800 CST

Quando o emulador de terminal sai, por que o shell também sai?

  • 772

Quando inicio um emulador de terminal (por exemplo, qterminal), ele inicia o shell padrão (por exemplo, bash). E quando eu saio do terminal (por exemplo, clicando no botão x ou matando o terminal), o shell também sai. Não permanece nenhum processo do shell. Gostaria de saber como esse mecanismo é implementado.

A princípio, suspeitei que o terminal enviasse algum sinal para o shell. Então eu prendo SIGQUIT, SIGINT, SIGTERM, SIGHUP no shell, mas nenhum sinal foi capturado. Eu não tenho nenhuma idéia além do sinal.

Pode depender do terminal e do shell e talvez do sistema operacional. Por favor, diga-me qualquer informação sobre esta situação.

shell terminal
  • 1 1 respostas
  • 147 Views

1 respostas

  • Voted
  1. Best Answer
    user1686
    2022-02-23T00:18:16+08:002022-02-23T00:18:16+08:00

    Normalmente o terminal envia um hangup (SIGHUP) para o processo. Além disso, quando o terminal fecha sua extremidade 'mestre' do pty, certos processos anexados a ele também recebem automaticamente um SIGHUP do kernel – se o terminal enviou um ou não.

    Embora o sinal do kernel não seja enviado para todos os processos que têm o pty como terminal de controle - não verifiquei exatamente, mas acho que é entregue especificamente apenas para o "pgroup de primeiro plano", basicamente o mesmo que com SIGINT/ SIGQUIT de Ctrl+C/Ctrl+\.

    Os próprios shells, como o Bash, já possuem um manipulador para SIGHUP que fornece SIGHUPs adicionais para todos os trabalhos em segundo plano gerenciados pelo shell (ignorando aqueles que foram disowned), por exemplo, a sleep 1h &será SIGHUP'd pelo Bash quando o último estiver prestes a sair devido à sua próprio SIGHUP recebido.

    Por exemplo, ao fechar o terminal de forma limpa:

    $ sudo strace -p ${pid_of_bash}
    strace: Process 102874 attached
    pselect6(1, [0], NULL, NULL, NULL, {sigmask=[], sigsetsize=8}) = ? ERESTARTNOHAND
    --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=87390, si_uid=1000} ---
    --- SIGCONT {si_signo=SIGCONT, si_code=SI_KERNEL} ---
    rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
    --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
    rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
    [...]
    

    E ao usar um depurador para emitir close(ptmx_fd)do processo do terminal:

    $ sudo strace -p ${pid_of_bash}
    pselect6(1, [0], NULL, NULL, NULL, {sigmask=[], sigsetsize=8}) = 1 (in [0])
    --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
    --- SIGCONT {si_signo=SIGCONT, si_code=SI_KERNEL} ---
    rt_sigreturn({mask=[]})                 = 1
    read(0, "", 1)                          = 0
    rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
    ioctl(2, TCXONC, TCOON)                 = -1 EIO (Input/output error)
    write(2, "\33[?2004l\r", 9)             = -1 EIO (Input/output error)
    

    Finalmente, quando o pty é fechado, o shell (ou outro programa em primeiro plano) receberá EOF ao tentar ler a partir dele (ou seja read(), retornará 0), que será tratado como se você pressionasse Ctrl + D - isso também geralmente fazer com que o programa saia, embora é claro que ele possa ignorar o EOF (eu vi um programa específico entrar em um loop infinito neste caso, quando decidiu ignorar o SIGHUP e o EOF).

    É muito possível que o shell saia no EOF antes de chegar ao seu manipulador SIGHUP personalizado. Por exemplo, posso reproduzir seus resultados no Bash no GNOME Terminal ( trap ... SIGHUPsem ser chamado), no entanto, se eu definir adicionalmente IGNOREEOF=1o Bash para não sair no EOF, a armadilha SIGHUP personalizada será realmente invocada.

    Uma armadilha personalizada também substitui o comportamento padrão de "sair no SIGHUP" do Bash. Então, quando eu digo ao Bash para ignorar EOFs e interceptar SIGHUP, ele continua tentando imprimir um prompt para um tty inexistente - a saída 'strace' mostra ele chamando todos os meus ganchos PROMPT_COMMAND usuais, tentando escrever o prompt para stdout, obtendo EIO , em seguida, tentando escrever mensagens de erro para stderr, obtendo EIO a partir disso, e somente depois ele decide que basta e sai.

    • 3

relate perguntas

  • Como funciona este comando? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

  • FreeBSD's sh: funções de lista

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • o que grep -v grep faz

  • Como salvar um caminho com ~ em uma variável?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve