Como posso garantir que um script seja executado após um serviço ser interrompido, mas antes que outro serviço seja interrompido?

2

Eu deveria executar um script específico sempre que um servidor estiver sendo encerrado, garantindo que alguns serviços sejam sempre interrompidos, enquanto outros, mas os serviços necessários ainda estejam ativos.

Na prática: devo executar um script de backup, tirando um instantâneo do banco de dados MySQL, depois que o servidor da Web no mesmo host for desligado (garantindo que o banco de dados esteja em estado consistente). Também devo garantir que a rede esteja disponível, pois o script de backup transfere o arquivo para outro host.

Eu tentei criar uma tarefa recente com a seguinte sub-rotina:

start on (stopped apache2 and stopping mysql and net-device-up IFACE=eth0)

No entanto, este script nunca foi executado.

Quais são as estrofes necessárias para garantir que o script seja executado corretamente? Ou é possível com o upstart?

Update: O SO que testei é o Ubuntu 11.04 (natty)

    
por Ville Mattila 02.09.2011 / 20:51

1 resposta

1

É importante lembrar que o upstart é um sistema baseado em eventos, não um sistema baseado em dependência.

Portanto, usar "e" pode ser perigoso. Você está pedindo para começar a esperar até que todos esses eventos aconteçam para começar seu trabalho.

Assim, o primeiro tempo da net-device-up IFACE = eth0 é emitido (durante o boot se for um servidor, ou sempre que for plugado se for um laptop e gerenciado pelo NetworkManager), então essa será a primeira condição. Então o upstart esperará até que o apache2 seja parado. Isso nunca será emitido se você estiver usando o script apache2 do sistema, porque ele está em /etc/init.d e não emitirá eventos de início / início / parada / parada.

O que você provavelmente quer é isso:

start on stopping mysql
task
pre-start script
  if service apache2 status ; then
     exit 0
  fi
  exec /my/backup/script
end script

Note que a tarefa é importante acima. Ele informa ao iniciante que esse trabalho não é "concluído" até que o script principal seja encerrado. Dessa forma, o evento de parada do mysql será bloqueado neste job até que seja feito. A verificação no apache2 pode não estar certa .. já que não tenho certeza do que você quer fazer se o apache2 ainda estiver rodando quando o mysql estiver parando. Na verdade, os dois eventos não são coordenados e, na verdade, acontecem em paralelo durante o desligamento do sistema, portanto, se você quiser que eles sejam coordenados, provavelmente precisará de outro trabalho inicial que parará / iniciará o apache2. Isso bastaria

start on started mysql
stop on stopping mysql

pre-start exec /etc/init.d/apache2 start
post-stop exec /etc/init.d/apache2 stop

Você também precisa remover os links normais com update-rc.d -f apache2 remove . Eu sugiro chamar isto de algo como apache2-upstart para que ele não confunda o comando de serviço.

    
por 18.01.2012 / 17:50