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 / server / Perguntas / 803247
Accepted
Lawrence Wagerfield
Lawrence Wagerfield
Asked: 2016-09-16 03:23:42 +0800 CST2016-09-16 03:23:42 +0800 CST 2016-09-16 03:23:42 +0800 CST

O script bash pai não está recebendo 'trap' apesar do processo ainda estar em execução

  • 772

O que realmente estou tentando alcançar:

Estou tentando fazer um daemon personalizado funcionar em um sistema que usa o SysVinit. Já tenho o /etc/init.d/xyzscript bootstrapper, que chama meu daemon, mas não o coloca automaticamente em segundo plano. Isso é semelhante a como serviços como nginxse comportam: os fundos binários em si - ou seja, não é responsabilidade do /etc/init.d/nginxscript daemonizar o processo, portanto, se você executar /opt/nginx/sbin/nginxdiretamente, também experimentará a execução daemonizada/em segundo plano.

O problema

Meu problema é que, usando meu método atual, o daemon não termina com o processo pai (que é o que é encerrado quando você chama service xyz stop).

Estou usando um launcher.shscript pai que executa um daemon.sh &script. No entanto, quando eu mato launcher.sho daemon.shcontinue a ser executado, apesar dos meus melhores esforços com trap(ele simplesmente nunca é chamado):

-> launcher.sh

#!/bin/bash

function shutdown {
    # Get our process group id
    PGID=$(ps -o pgid= $$ | grep -o [0-9]*)

    echo THIS NEVER GETS CALLED!

    # Kill process group in a new process group
    setsid kill -- -$$
    exit 0
}

trap "shutdown" SIGTERM

# Run daemon in background

./daemon.sh &

-> daemon.sh

#!/bin/bash

while true
do
    sleep 1
done

Para correr e matar:

./launcher.sh

<get PID for launcher>

kill -TERM 123 # PID of launcher.sh... which _is_ still running and has its own PID.

Resultado: daemon.shainda em execução e a shutdownfunção nunca é chamada - confirmei isso antes colocando um echo hereno corpo da função.

Alguma ideia?

EDIT: O launcher.shscript está sendo executado usando daemon launcher.sh, onde daemonestá uma função fornecida pelo arquivo do Amazon Linux init.d/functions(veja aqui: http://gist.github.com/ljwagerfield/ab4aed16878dd9a8241b14bc1501392 ‌​f).

linux unix bash shell daemon
  • 2 2 respostas
  • 1480 Views

2 respostas

  • Voted
  1. Best Answer
    J Earls
    2016-09-16T04:26:07+08:002016-09-16T04:26:07+08:00

    O trapcomando só funciona enquanto o script estiver em execução.

    A maneira como isso normalmente é feito é que, quando o daemon é bifurcado, ele grava seu PID em um arquivo. O script de inicialização então usa esse arquivo para determinar qual processo matar ou chama seu script de inicialização para matar o processo.

    Para a primeira instância:

    launcher.sh:

    /path/to/daemon.sh &
    echo "$!" > /var/run/xyz.pid
    

    Uma versão simples e um tanto ingênua de /etc/init.d/xyz:

    # ... pull in functions or sysconfig files ...
    start() {
        # ... do whatever is needed to set things up to start ...
        /path/to/launcher.sh
    }
    stop() {
        # ... do whatever is needed to set things up to stop ...
        kill `cat /var/run/xyz.pid`
    }
    # ... other functions ...
    

    Um script de inicialização não ingênuo dependerá de qual versão do Linux você está executando; Eu sugeriria olhar para outros exemplos /etc/init.dpara ver como eles fazem isso.

    • 1
  2. Ryan Babchishin
    2016-09-16T04:16:10+08:002016-09-16T04:16:10+08:00

    Não faz sentido para mim por que você deseja que dois scripts façam isso. Você pode simplesmente chamar daemon.sh &seu script de inicialização? Ou talvez você possa usar o daemoncomando.

    NAME
           daemon - turns other processes into daemons
    
    SYNOPSIS
            usage: daemon [options] [--] [cmd arg...]
    

    Se você precisar usar trap, talvez possa usá-lo daemon.shpara um desligamento limpo. É difícil dizer se esses são seus scripts reais ou apenas exemplos.

    Parte do problema launcher.shé que ele sai ... não há nada para mantê-lo funcionando, então você não pode matá-lo - ele já se foi. Não estou apenas dizendo isso, na verdade testei seu script para ter certeza antes de responder. Veja meus comentários adicionados ao seu script.

    #!/bin/bash
    
    function shutdown {
        # Get our process group id
        PGID=$(ps -o pgid= $$ | grep -o [0-9]*)
    
        echo THIS NEVER GETS CALLED!
    
        # Kill process group in a new process group
        setsid kill -- -$$
        exit 0
    }
    
    trap "shutdown" SIGTERM
    
    # Run daemon in background *** script keeps running ***
    
    ./daemon.sh &
    
    # It exits here
    echo "Exiting... bye!"
    
    • 0

relate perguntas

  • Protegendo um novo servidor Ubuntu [fechado]

  • (Soft) RAID 6 no Ubuntu 7.10, devo migrar para 8.10?

Sidebar

Stats

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

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 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