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.