Pergunta

Eu preciso de um aplicativo para ser executado em segundo plano no meu servidor web, mas eu preciso ser capaz de iniciar / parar o aplicativo com privilégios de root.

A fim de fazer isso, eu quero ter um serviço executado com privilégios de root, para que ele possa matar o aplicativo e começar tudo de novo se necessário.

Finalmente, eu preciso ser capaz de enviar os comandos de início e matar para o serviço via Apache / PHP, para que ele possa ser controlada indiretamente através da web.

Como faço para criar um serviço Linux?
Como faço para comunicar com um serviço Linux dessa maneira?

Agradecemos antecipadamente!

Foi útil?

Solução

Use o comando exec no seu script PHP para chamar arquivos shell. Os arquivos de shell pode ser configurado com o bit "setuser" para que ele irá executar como seu proprietário (em vez de correr com permissões do servidor web).

Claro, você precisa ter muito cuidado -. Lotes de testes, monitoramento, etc

Finalmente, pense sobre o serviço executado como um usuário dedicado, não como root. Por exemplo, como apache ea maioria dos outros serviços bem feito fazer.

Adicionado: Re: executando um serviço no Linux. Depende do seu sabor do Linux. Se você quiser ter certeza de que o seu serviço de aplicativo será automaticamente re-iniciado se ele falhar, além de logging, check-out Runit:

https: //web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/opensource/?p=202

http://smarden.org/runit

Adicionado: Em vez de bit setuid, eu acho que a sugestão de Frank (em comentário) da utilização do sistema sudo é melhor

.

Outras dicas

Assim, você tem três peças aqui:

  • O seu servidor web, sem privilégios de root
  • Uma aplicação
  • Um daemon que está a monitorizar a aplicação

Seu problema não está lançando o daemon, é escrevê-lo, e se comunicar com ele a partir do servidor web, sem a necessidade de privilégios de root.

Um daemon pode ser tão simples como um aplicativo não interativo lançado em segundo plano:

# my_dameon &

Eu não sou um developper php, mas à procura de fila de mensagens e php, descobri beanstalkd
Olhando para o exemplo na primeira página parece que você pode usá-lo para fazer o seguinte:

  • O apache / php envia alguma mensagem para beanstalkd
  • O seu daemon lê a mensagem de beanstalkd. Baseado no comando ele começa ou matar ou recarregar a aplicação de fundo.

Você pode escrever seu daemon em PHP, uma vez que existem cliente em muitas línguas
Você também pode verificar esta questão

Você pode criar um daemon que aceita os seguintes comandos:

  • daemon_name start
  • daemon_name stop
  • daemon_name restart
  • deamon_name reload

Iniciando o daemon não deve ser difícil. Apenas executar daemon_name start a partir de um script PHP deve executá-lo. Após a partida, você pode escrever o PID do processo para um arquivo de bloqueio (para parar, reiniciar ou recarregar mais tarde). O daemon deve lidar com sinais.

Em um script PHP, você pode então invocar daemon_name stop. Isso deve acender um novo daemon que iria verificar o arquivo de bloqueio e obter a PID do daemon funcionando e enviar um sinal de que seria tratado pelo daemon em execução. O arquivo de bloqueio deve ser removido / apagada e então o stop iniciar daemon / processo pode parar.

Eu acho que você deve olhar para inetd, que pode ser configurado para executar todos os tipos de serviços, e é executado como root. Você poderia, então, escrever um programa relativamente simples que não é a própria raiz privilegiada, mas que quando executado pelo root faz as tarefas que você precisa fazer.

Tanto quanto se comunicar com o serviço que você não disse que tipo de serviço é, no entanto, supondo que você está escrevendo-se métodos mais comuns seria de comunicar via soquetes UNIX ou MMAP. Depende de suas necessidades realmente.

Oh yeah, de salientar que já existem aplicações para a gestão web de sistemas Linux. Webmin é uma muito boa que pode ser configurado para permitir tanto ou tão pouco controle que você precisar.

Como @shodanex sugere, usando Beanstalkd seria uma excelente maneira de desligar um front-end web a partir de um trabalhador de linha de comando running-as-raiz. Ele poderia trivialmente ser definido somente para executar exatamente o que era necessário.

Para executar o trabalho, System_Daemon do Pear pode gerar e executar um script em execução daemon, com start / stop / restart.

Ao fazê-lo ser muito, muito cuidado. Nunca use qualquer usuário apresentou dados a partir da web no comando exec. isto poderia permitir que alguém arbitrariamente executar comandos em sua máquina.

Também eu segunda Frank usar uma regra sudo para que possa executar esse comando específico com as permissões você precisa, mas nada mais. Será mais seguro assim.

É claro que com

sudo apt-get install openbsd-inetd

Você pode criar um serviço que você deseja

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top