Gancho seqüencial antes de entrar no runlevel?

1

Eu tenho um problema muito específico e tenho lutado contra o Upstart a noite toda sem sucesso.

No meu caso particular, tenho um servidor com vários clientes inicializados pelo PXE. Os dados para os clientes são armazenados no MySQL. Quando encerro o servidor, antes que algo aconteça, preciso que todos os clientes PXE também sejam desligados. No antigo e sequencial mundo do sysvinit, isso era muito fácil: basta colocar o script de desligamento remoto no início da sequência, antes que o trabalho em rede, portmap, nfs, mysql caíssem. Isso foi ok, mesmo que demorasse 10 minutos para todos os clientes saírem (mas normalmente 30 segundos seriam suficientes).

Com o upstart, não posso, por minha vida, fazer com que os clientes desliguem antes do servidor. Eu consegui executar o script antes do mysql cair, mas isso não é suficiente, pois parece que a rede e / ou outras coisas de suporte que os clientes PXE REALMENTE PRECISAM diminuem, então eles montam NFS e eles nunca desligue. Eles serão desligados assim que o servidor fizer o backup.

O mais perto que cheguei de conseguir o que eu quero é isso:

kill timeout 70

start on runlevel [016] and (stopping mysql or stopping portmap or stopping idmapd or stopping statd)

task

exec the-script-that-shuts-clients-down.sh

O script diz a todas as máquinas para desligarem e depois ficam de olho nelas (enviando pings uma vez por segundo), e somente quando estão todas em baixo, ou o script fica entediado e desiste, o servidor deve continuar desligar a sequência.

Agora, com o Upstart, meu script é morto depois de aproximadamente 7 segundos. Mesmo com o tempo limite de 70 segundos acima.

Idealmente, gostaria de executar esse script antes de qualquer outra coisa ser acionada pela opção runlevel, mas o Google diz que estou sem sorte. Não há mecanismo SEQUENCIAL no Upstart - mesmo "compatibilidade com versões anteriores" rc é executado em paralelo com o resto dos serviços iniciantes.

Alguma idéia sobre isso? Estou executando o Ubuntu 10.10.

    
por Radu C 16.09.2011 / 08:34

1 resposta

1

Consegui resolver o meu problema com isto:

kill timeout 70

start on runlevel RUNLEVEL=[016] PREVLEVEL=[2345] and (starting rc RUNLEVEL=[016] or stopping mysql or stopping portmap or stopping idmapd or stopping statd)

task

exec the-script-that-shuts-clients-down.sh

Bem, quase, porque parece que o Upstart tem um pequeno bug que é específico para enganchar no rc. Pelo menos no Ubuntu 10.10 ele faz. Eu não tenho um 11.04 à mão para confirmar isso.

O trabalho agora parece assim:

Em the-script-that-shuts-clients-down.sh , antes de sair eu faço

touch /etc/init/my-job.conf

onde my-job.conf contém as coisas acima. Até agora, ele desatou o rc de start / starting toda vez.

Outro problema é que se eu escrever iniciando rc ao invés de iniciando rc RUNLEVEL = [016] então o upstart fica preso no rc na inicialização também (e o mesmo comando touch unsticks-lo).

    
por Radu C 20.09.2011 / 03:40