Iniciar / parar o programa a partir do site

1

Eu tenho alguns usuários na minha máquina que permitem executar pequenos servidores de voz Mumble. Eu gostaria que eles pudessem iniciar / parar seu servidor de voz em um site (sendo executado pelo Apache). Com a configuração atual, tenho cada servidor sendo executado como um usuário diferente (a conta de usuário específica da pessoa).

O que não consigo descobrir é a melhor maneira de iniciar / parar o servidor sem atraso. Atualmente, eu tenho o site fazer uma entrada em um banco de dados sempre que quiserem iniciar / parar o seu serviço. Então, eu tenho um script cron que executa cada minuto olhar no banco de dados para esses começos / paradas. Esse script cron mudará para a conta de usuários e executará o servidor como esse usuário. Meu problema com isso é que pode levar até cerca de 1 minuto para que a ação aconteça.

Existe uma maneira mais responsiva de realizar isso?

    
por Lotte 22.05.2012 / 15:48

5 respostas

3

Em vez de, ou além de, gravar em um banco de dados, você considerou gravar em um pipe nomeado? Você pode criar um pipe nomeado por usuário e criar um processo para assistir a cada pipe nomeado. Quando o comando 'restart' for iniciado, reinicie o processo imediatamente.

Esta não é uma solução completa e pode ser melhorada, mas deve dar uma idéia de como você pode monitorar o pipe nomeado e reiniciar o processo.

while read line <$pipe
 do
  if [[ "$line" == 'restart' ]]; then
    restart_some_service
  fi
done
    
por 22.05.2012 / 17:08
1

Isso pode ser um exagero, mas você já considerou o Usermin ? Eles listam um plug-in de processo nos plugins padrão , que permitem que seus usuários

View all processes running on the system, kill those belonging to [them], and start new ones.

( Nunca tentei isso , achei que poderia ser bonito, "profissional".)

( Editar Em relação a "Mumble", parece haver algumas interfaces da web já , mas não tenho idéia se eles ajudam na sua situação.)

    
por 22.05.2012 / 16:17
1

Se essas pessoas para as quais você está hospedando servidores forem confiáveis e não enviarem spam / hackear o servidor, por que não apenas programar a interface da web para passar diretamente o início / parada para o shell

Por exemplo, no PHP você pode programar isso na página:

<?php
  // checks, templating, blah, blah, blah
  $status = exec('/path/to/service/mumbled status')

  if ($status == "stopped")
    // display start button, hook exec('mumbled stop') command to it

  if ($status == "running")
    // display stop button, hook exec('mumbled start') command to it
?>

Se fosse eu, eu iria por esse caminho, mas isso é só comigo.

    
por 22.05.2012 / 20:52
0

Eu configurei algo assim em um dos meus servidores da web que tinha um problema de sshd morrer ocasionalmente - eu queria reiniciar manualmente o sshd a partir de uma interface web autenticada. Isso foi planejado (no meu caso) como uma solução de curto prazo, já que uma atualização completa do sistema operacional não estava muito longe de qualquer maneira.

Eu configurei uma página php similar a qual nonplus sugeriu, usando shell_exec para executar um comando específico via sudo:

  $output = shell_exec("/usr/local/bin/sudo /usr/local/etc/rc.d/sshd.sh restart");
  echo "<pre>$output</pre>";

Dessa forma, eu poderia editar o arquivo sudoers local para dar ao meu usuário do apache o acesso apropriado a comandos específicos. Eu precisava conceder a ele o privilégio de nível de raiz de iniciar o sshd; você poderia limitá-lo a iniciar / interromper os serviços apropriados como os usuários apropriados.

    
por 23.05.2012 / 07:20
0

Seu método cron está no caminho certo ... a maioria dos outros métodos tem várias preocupações de segurança. Para tornar a mesma ideia mais rápida, você pode tocar em um arquivo e usar o inotify para detectar que ele foi modificado. inotify é extraordinariamente rápido. 'inotify-tools' é um conjunto prontamente disponível de ferramentas de linha de comando que usam inotify. Existem alguns bons exemplos no site do github para inotify-tools.

De: link

#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1)
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'

É basicamente instantâneo - o inotify é um recurso do kernel que essas ferramentas tiram proveito de quais solicitações da notificação do kernel em eventos muito específicos do sistema de arquivos.

    
por 24.05.2012 / 09:05