A parada de serviço é síncrona ou assíncrona?

3

Eu fiz sudo service ... stop antes de desligar a máquina remotamente, por SSH, mas depois percebi que não sabia se stop é síncrono ou não e me perguntei se não era muito rápido para desligar a máquina Ubuntu .

Então, meus medos são baseados em um palpite errado ou não?

Edit: Meu serviço é pessoal, ele recebe coisas de uma porta e grava coisas de vez em quando em um banco de dados. Temo que as coisas não tenham tempo de serem descarregadas se o serviço for interrompido abruptamente. stop cuida do rubor, mas dado o tempo que levaria ...

    
por Thomas 04.09.2013 / 10:55

2 respostas

0

Depende de como seu serviço é interrompido. Só você sabe: os métodos de início e término do serviço são coisas que você deve documentar para os usuários do seu serviço e, idealmente, fornecer.

Se seu serviço for interrompido enviando um sinal chamando kill de um script de shell, isso é assíncrono. O comando kill ou a chamada do sistema envia um sinal para um processo e retorna imediatamente. Não há nenhum mecanismo para o processo telefonar de volta para notificar que processou o sinal para sua satisfação. Então você precisa encontrar outro método para sinalizar que está pronto.

Muitos métodos são possíveis, como fazer com que o serviço crie ou remova um arquivo e o script de controle observe as alterações feitas nesse arquivo. No entanto, eles tendem a ser desajeitados. Enviar um sinal de um processo não relacionado não é um método muito bom se você precisar de feedback quando o serviço for concluído.

Se o seu serviço for interrompido por meio de uma diretiva stop em uma descrição de serviço Upstart, o Upstart envia um sinal para o processo. O Upstarts aguarda alguns segundos para o processo parar. Como o Upstart é o pai do processo, ele recebe uma notificação do kernel (um sinal SIGCLD) quando o processo é encerrado. Isso só funciona bem quando o processo não se bifurca para se colocar em segundo plano; As descrições de serviço do Upstart normalmente chamam daemons com uma opção que diz a eles para não bifurcar (por exemplo, ssh -D ).

Os serviços avançados têm um comando de limitação. Quando você chama o comando de limitação, eles param de aceitar novas conexões. Quando todas as conexões pendentes são fechadas, o serviço envia uma resposta positiva ao comando de limitação e, em seguida, sai. O método de comunicação é tipicamente um soquete Unix ou IP.

    
por 06.09.2013 / 03:05
3

Garanta que seu aplicativo

  1. registra seu desligamento adequado para o syslog, consulte man 3 syslog para obter detalhes
  2. manipula o SIGTERM escrevendo tudo que precisa no banco de dados, fechando a conexão e exit ing; veja man 2 sigaction para detalhes
  3. possui um manipulador de parada de trabalho em /etc/init.d; veja man init e man stopping

e, em seguida, você não precisará adivinhar se seu aplicativo para corretamente, você saberá.

    
por 04.09.2013 / 13:17

Tags