Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como gerenciar processos do lado do servidor usando MySQL


Parece que você está tentando iniciar processos de longa duração a partir de um servidor da Web e, em seguida, rastrear esses processos em um banco de dados. Isso não é impossível, mas não é uma prática recomendada.

O principal problema é que uma requisição HTTP precisa estar sendo tratada no seu servidor web para que você realmente faça qualquer coisa (incluindo rastrear processos em execução no sistema) - você precisa de algo que possa ser executado o tempo todo ...

Em vez disso, uma ideia melhor seria ter outro processo "gerente" daemonizado (como você menciona perl, essa seria uma boa linguagem para escrevê-lo) gerar e rastrear as tarefas de longa duração (por PID e sinais), e para isso processo para atualizar seu banco de dados SQL.

Você pode então fazer com que seu processo "gerente" escute solicitações para iniciar um novo processo de seu servidor web. Existem vários mecanismos IPC que você pode usar. (por exemplo:sinais, SysV shm, soquetes de domínio unix, filas em processo como ZeroMQ, etc).

Isso tem vários benefícios:
  • Se seus scripts gerados precisam ser executados com isolamento baseado em usuário/grupo (do sistema ou entre si), seu servidor web não precisa ser executado como root, nem ser configurado.
  • Se um processo gerado "travar", um sinal será enviado ao processo "gerente", para que ele possa rastrear execuções incorretas sem problemas.
  • Se você usar filas em processo (por exemplo:ZeroMQ) para entregar solicitações ao processo "gerente", ele poderá "limitar" as solicitações do servidor da Web (para que os usuários não possam causar D.O.S intencional ou acidentalmente).
  • Independentemente de o processo gerado terminar bem ou não, você não precisa de uma solicitação HTTP 'ativa' para o servidor da Web para atualizar seu banco de dados de rastreamento.

Sobre se algo que deveria be running is running, isso depende muito da sua semântica. (ou seja:é baseado em um tempo de execução conhecido? com base nos dados consumidos? etc).

A verificação para saber se é correr pode ser duplo:
  1. O processo "manager" atualiza o banco de dados conforme apropriado, incluindo o PID gerado.
  2. Seu código hospedado no servidor web pode realmente listar processos para determinar se o PID no banco de dados é realmente em execução e até quanto tempo está fazendo algo útil!

A verificação para saber se não a execução teria que ser baseada na convenção:
  1. Nomeie os processos gerados com algo que você possa prever.
  2. Obtenha uma lista de processos para determinar o que ainda está em execução (extinto?) que não deveria estar.

Em ambos os casos, você pode informar os usuários que solicitaram que os processos sejam gerados e/ou realmente fazer algo a respeito.

Uma abordagem pode ser ter um trabalho CRON que leia do banco de dados SQL e faça ps para determinar quais processos gerados precisam ser reiniciados e, em seguida, solicita novamente que o processo "gerente" o faça usando o mesmo mecanismo IPC usado pelo servidor web. Como você diferencia inícios versus reinícios em seu rastreamento/monitoramento/registro depende de você.

Se o próprio servidor perder energia ou travar, você poderá fazer com que o processo "gerente" execute a limpeza quando for executado pela primeira vez, por exemplo:
  1. Procure entradas no banco de dados para processos gerados que supostamente estavam em execução antes do desligamento do servidor.
  2. Verifique esses processos por PID e tempo de execução (isso é importante).
  3. Regenere os processos gerados que não foram concluídos ou armazene algo no banco de dados para indicar ao servidor da Web que esse foi o caso.

Atualização nº 1

De acordo com seu comentário, aqui estão algumas dicas para começar:

Você mencionou perl, então supondo que você tenha alguma proficiência lá -- aqui estão alguns módulos perl para ajudá-lo a escrever o script do processo "manager":

Se você ainda não estiver familiarizado com ele CPAN é o repositório para módulos perl que fazem basicamente qualquer coisa.

Daemon::Daemonize - Para daemonizar o processo para que ele continue em execução após o logout. Também fornece métodos para escrever scripts para iniciar/parar/reiniciar o daemon.

Proc::Spawn - Ajuda com scripts filho 'gerando'. Basicamente faz fork() então exec() , mas também lida com STDIN/STDOUT/STDERR (ou mesmo tty) do processo filho. Você pode usar isso para iniciar seus scripts perl de longa duração.

Se o código front-end do seu servidor web ainda não estiver escrito em perl, você precisará de algo que seja bastante portátil para passagem de mensagens e enfileiramento entre processos; Eu provavelmente faria o front-end do seu servidor web em algo fácil de implantar (como PHP).

Aqui estão duas possibilidades (há muitas mais):

Proc::ProcessTable - Você pode usar essa verificação em processos em execução (e obter todos os tipos de estatísticas, conforme discutido acima).

Hora::HiRes - Use as funções de tempo de alta granularidade deste pacote para implementar sua estrutura de 'estrangulamento'. Basicamente, apenas limite o número de solicitações que você retira da fila por unidade de tempo.

DBI (com mysql ) - Atualize seu banco de dados MySQL a partir do processo "manager".