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 / 455214
Accepted
Kevin
Kevin
Asked: 2018-07-14 14:03:43 +0800 CST2018-07-14 14:03:43 +0800 CST 2018-07-14 14:03:43 +0800 CST

Definir máscara de sinal do processo filho no Bash

  • 772

Aqui está o meu problema - estou tentando escrever um pequeno script wrapper que adiciona um argumento de linha de comando quando o Xorg é chamado (não tenho acesso à fonte do chamador). Parecia bastante simples, mas o problema que estou executando agora é que o chamador está esperando por um USR1sinal do Xorg. Na página de manual do XSERVER:

SIGUSR1

Este sinal é usado de forma bastante diferente de qualquer um dos acima. Quando o servidor é iniciado, ele verifica se herdou SIGUSR1 como SIG_IGN em vez do SIG_DFL usual. Nesse caso, o servidor envia um SIGUSR1 para seu processo pai depois de configurar os vários esquemas de conexão. O Xdm usa esse recurso para reconhecer quando a conexão com o servidor é possível.

Eu pensei que poderia simplesmente capturar o sinal e encaminhá-lo:

#!/bin/bash
parent_trap(){
   echo sending USR1 to $PPID &> /tmp/wrapper.log
   kill -USR1 $PPID
}
trap "parent_trap" USR1
Xorg $@ (extra stuff) &
wait

Mas é claro que isso não funciona, pois o próprio script é iniciado pelo chamador ignorando USR1. ACHO que o que preciso fazer é fazer com que o script pare de ignorar o sinal, mas também de alguma forma inicie o Xorg com USR1ignorado (para acionar o comportamento da página man.)

Isso é possível no Bash/alguma outra linguagem de script? Por algumas razões, espero evitar uma solução compilada, mas não é impensável. Também é possível que eu esteja pensando completamente sobre isso errado e haja alguma outra maneira de ir USR1do Xorg para o chamador.

bash x11
  • 1 1 respostas
  • 1164 Views

1 respostas

  • Voted
  1. Best Answer
    slm
    2018-07-14T16:52:33+08:002018-07-14T16:52:33+08:00

    Seu novo roteiro

    Em vez de tentar fazer algo sofisticado com os sinais, por que não fazer isso:

    $ cat xorg_wrapper
    #!/bin/bash
    
    exec Xorg $@ (extra stuff)
    

    Como funciona

    Para ilustrar o que está acontecendo com o acima, aqui está um exemplo mais elaborado que ajuda a mostrar a mecânica do execscript acima.

    $ cat xorg.bash
    #!/bin/bash
    
    echo "script's PID: $$"
    sleep 5
    echo "starting fakeXorg..."
    exec sleep 5
    
    # Nothing below here will execute due to exec
    echo $!
    echo "fakeXorg finished..."
    sleep 5
    

    Isso iniciará o Xorg como você especificou, mas como estamos usando o execcomando Xorgassumirá o mesmo PID e substituirá nosso xorg.bashscript por ele mesmo.

    NOTA: A intenção das últimas 3 linhas acima é demonstrar que o xorg.bashnão está mais em reprodução/execução após a execução do exec sleep ...comando.

    Exemplo

    Primeiro executamos nosso script:

    $ ./xorg.bash
    script's PID: 22471
    
    ...5 seconds passes...
    
    starting fakeXorg...
    
    ...now the exec runs and 5 more seconds pass...
    
    $
    

    Se fôssemos monitorar isso em outro shell usando ps auxf, veríamos isso.

    fase 1 - xorg.bash pré-executivo
    $ ps auxf
    ....
    root     21184  0.0  0.3 116596  3412 pts/2    S    20:19   0:00                  \_ /bin/bash
    root     22471  0.0  0.1 113176  1400 pts/2    S+   20:43   0:00                      \_ /bin/bash ./xorg.bash
    root     22472  0.0  0.0 107948   348 pts/2    S+   20:43   0:00                          \_ sleep 5
    
    fase 2 - xorg.bash pós-executivo
    $ ps auxf
    ....
    root     21184  0.0  0.3 116596  3412 pts/2    S    20:19   0:00                  \_ /bin/bash
    root     22471  0.0  0.0 107948   352 pts/2    S+   20:43   0:00                      \_ sleep 5
    

    Observe na fase 1 que xorg.bashtem um PID de 22471, mas na fase 2, exec sleep 5agora tem o mesmo PID, 22471.

    As linhas depoisexec ...

    A função do execcomando faz com que o shell atual seja substituído por outro executável:

       $ help exec
        ...
            Replace the shell with the given command.
    

    Como consequência disso, quaisquer comandos no xorg.bashnunca são executados porque no ponto onde exec ....está, xorg.bashdeixa de existir como processo, tendo sido substituído pelo sleepcomando.

    Referências

    • Encaminhar SIGTERM para a criança no Bash
    • 2

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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