Upstart mata todo o processo iniciado pelo script

6

Então eu uso o Upstart [myscript] para iniciar um script [A] , que inicia outro script [B] , que por sua vez inicia alguns outros scripts [GROUP C] .

Quando executo stop [myscript] , encontro o comportamento incomum em que [GROUP C] também é interrompido. Todos os scripts em [GROUP C] foram iniciados com & e estão sendo executados em segundo plano. Estou surpreso que eles também sejam mortos pelo comando stop [myscript] . Por que isso e como evitar que isso aconteça?

EDIT: Basicamente, [myscript] é o seguinte:

pre-start script
          echo 'Starting myscript Daemon\n'
end script

script
        exec /foo/bar/myscript-start.sh
end script

post-stop script
        echo 'and apparently we are done....'
end script
    
por MirroredFate 07.11.2013 / 00:25

2 respostas

2

Upstart mata o grupo de processos :

  

O sinal especificado pela estrofe do sinal kill é enviado para o processo   grupo do processo principal. (de tal forma que todos os processos pertencentes ao   processo principal de empregos são mortos). Por padrão, este sinal é SIGTERM.

Para evitar isso, inicie os processos filhos em uma nova sessão com setsid , por exemplo:

setsid top

ps ( ps -eo '%c %a %p %P %r' ) mostrará que o processo tem um grupo de processos exclusivo e um pai pid de 1.

    
por bain 16.05.2018 / 18:32
1

Parece que você não entende como as sub-rotinas dos scripts funcionam.

estrofe de pré-início

pre-start script
          echo 'Starting myscript Daemon\n'
end script

Este script inicia antes dos seus scripts principais, se falhar, a sequência de inicialização falhará. Isto é normalmente usado para algumas operações ad hoc que permitirão que o primeiro script seja iniciado, elas não são semelhantes a um daemon (continuamente em execução no background). Exemplo:

pre-start script
    /lib/init/apparmor-profile-load usr.sbin.avahi-daemon
end script

script
    opts="-D"
    [ -e "/etc/eucalyptus/avahi-daemon.conf" ] && opts="${opts} -f /etc/eucalyptus/avahi-daemon.conf"
    exec avahi-daemon ${opts}
end script

Como você pode ver, o perfil apparmor é carregado pela primeira vez a partir do DBus (sim, meio estranho se você não conhece o backend do Ubuntu) e então inicia o serviço como pretendido. Esta operação é projetada para o processo que é executado uma vez.

roteiro de script

script
        exec /foo/bar/myscript-start.sh
end script

Esta é a única parte do seu programa que precisa ser executada continuamente e o upstart deve rastrear seu PID. Este processo morre quando você interrompe o script.

estrofe pós-parada

post-stop script
        echo 'and apparently we are done....'
end script

Essas estrofes são projetadas como uma espécie de processo de limpeza. Será executado assim que o roteiro principal morrer graciosamente. Por exemplo, apport:

post-stop script
    # Check for a hung resume.  If we find one try and grab everything
    # we can to aid in its discovery
    if [ -e /var/lib/pm-utils/status ]
    then
        ps -wwef > /var/lib/pm-utils/resume-hang.log
    fi

    if [ "'dd if=/proc/sys/kernel/core_pattern count=1 bs=1 2>/dev/null'" != "|" ]
    then
        exit 1
    else
        echo 0 > /proc/sys/fs/suid_dumpable
        echo "core" > /proc/sys/kernel/core_pattern
    fi
end script

Ele tenta detectar um reinício do sono que não foi bem-sucedido e inicia os preparativos para detectar o próximo travamento para que ele possa produzir um relatório útil (sim, é complicado novamente, mas esse foi o script mais simples que eu descobri em separado ufw que é supersimplificado). Como você pode ver, cada processo morre sozinho, pois pode bloquear o desligamento do sistema (em tais casos, há também um script que envia os sinais TERM e KILL para o processo suspenso).

Linha de fundo, o que você está experimentando é perfeitamente normal e é o comportamento desejado do iniciante.

    
por Braiam 07.11.2013 / 01:38