Carrega um serviço no Linux programaticamente [fechado]

0

Dado um nome de serviço (criado pelo usuário) e seu caminho, como posso carregar e iniciar o serviço em tempo de execução a partir de um programa C++ no Ubuntu.

Existem funções semelhantes às funções Windows como CreateService , OpenSCManager , OpenService etc. para fazer isso?

    
por Jackzz 02.02.2015 / 10:41

4 respostas

1

Eu encontrei algo similar. Um programa de watchdog simples que executa um serviço pela função exec. Você pode encontrá-lo aqui .

    
por 02.02.2015 / 11:30
3

Para iniciantes, isso deve estar no StackOverflow, não aqui.

O conceito completo que você conhece do Windows com serviços simplesmente não existe no Linux.

No Windows, seu processo registra um retorno de chamada que o Gerenciador de Controle de Serviços (SCM) usa para inicializar e controlar seu serviço. Dessa forma, as solicitações enviadas ao SCM referentes ao seu serviço podem ser processadas, como pausar, parar, iniciar, retomar.

No Linux, o conceito não existe como tal. Os mais próximos são programas sendo executados como um daemon.

Qualquer programa pode optar por desconectar-se de seu pai (por bifurcação dupla) e também pode desanexar do terminal. Esta é essencialmente a essência de um daemon no Unix em geral. É um processo em segundo plano, mas ao contrário do Windows, não há nenhum terceiro especial envolvido.

Bem, quase. O processo init garante que o processo seja coletado (e não fica por perto após a saída). Além disso, geralmente alguns scripts de inicialização (estilo antigo) ou um sistema init (systemd, upstart etc) serão usados com uma sintaxe especial para controlar um processo. Para isso, a maioria dos daemons terá uma opção para armazenar seu ID de processo (PID) em um arquivo de onde tais scripts podem lê-lo e usar o programa kill para enviar um sinal para controlar a execução do daemon (ou seja, processo em segundo plano) para dizer, por exemplo, para reler sua configuração ou para parar.

Você definitivamente quer comprar e ler o livro de Michael Kerrisk "O Guia Definitivo para Linux e Programação do Sistema UNIX" e talvez também escolher um clássico como APUE (Programação Avançada no Ambiente Unix) ) se você pretende estender seu desenvolvimento para outras plataformas unixóides (OSX, BSDs ...).

    
por 02.02.2015 / 11:48
3

Em sistemas semelhantes a unix, os daemons e o que você chamaria de processos regulares são a mesma coisa. Há uma linha borrada entre eles. Em essência, eles são separados semanticamente não por como eles funcionam, mas o que você espera deles. Um daemon é simplesmente um processo que aguarda em segundo plano para que você se comunique com ele, para que algum evento ocorra. Se o daemon precisar se comunicar com os usuários, ele próprio é responsável por configurar a comunicação: socket (unix ou inet), observação passiva do sistema de arquivos, arquivos de dispositivos ... Daemons são geralmente gerenciados por algum tipo de "gerenciador de serviços" - systemd , upstart ou systemV (que não é realmente gerenciamento, você apenas mantém alguns arquivos pid para saber como matá-los e alguns scripts de init para iniciá-los de uma maneira ordenada). Isso realmente depende do que você deseja alcançar:

Se você deseja iniciar um serviço uniformemente sob o gerenciador de serviços de seu sistema de destino, invoque comandos de controle para o sistema escolhido (isso depende da distribuição, mas o systemd está se tornando cada vez mais difundido). Por exemplo, você apenas invocaria systemctl start sshd e o sshd começaria.

Se você realmente quer apenas um processo em segundo plano que faça algum processamento, isso não é um daemon. Se você simplesmente fork e exec , você criará outro processo (que você pode manter em contato com um pipe), e você pode matar a criança quando você sair, então ela morre com você (ou a deixa órfã) , caso em que se torna mais daemônico).

Você pode bifurcar e definir a sessão e fechar os descritores de arquivo no processo filho para se tornar um daemon mais adequado.

No entanto, isso realmente depende do que você deseja alcançar. Você pode estar fazendo a pergunta errada aqui, e você está tentando fazer algo que nem faz muito sentido no linux.

    
por 02.02.2015 / 13:23
1

Entenda o que é um serviço

Os serviços são processos em execução em segundo plano. Eles não são interativos, eles não têm terminal de controle. No Linux, os serviços são chamados daemons.

Como gerenciar manualmente o serviço

via terminal

#run program that should be service, output_file stands for stdout output
./executable_path arg1 arg2 > output_file

#press CTRL-Z - stops process
#move process to the background, prints its PID
bg

#disown process or you may have started process with "nohup"
disown

Agora você tem serviço, você pode fechar o terminal, o serviço ainda estará em execução.

kill "PID print before

E o serviço está morto.

via scripts de shell

Script que inicia o serviço e salva seu PID no arquivo.

nohup ./executable args > output &
MY_PID=$!
echo $MY_PID > some_folder/service_pid

Script que encerra o serviço:

kill 'cat some_folder/service_pid'
rm some_folder/service_pid

via C ++

Você executa as mesmas etapas, como no exemplo, com scripts. Basta envolvê-lo em funções C como: system , fork e exec* . No entanto, isso é relacionado a programação, não relacionado ao Linux (unix.stackexchange.com). Procure pelo processo de criação a partir de c ++.

Integração com o gerenciador de serviços do sistema

Bem. É bem mais difícil, porque o Linux possui muitos gerenciadores de serviços e nem toda distribuição Linux usa o mesmo. O usuário também pode alterar o gerenciador de serviços, portanto, mesmo na mesma distribuição, você não tem garantia de que usará o mesmo gerenciador de serviços.

Os mais usados são upstart e systemd

    
por 02.02.2015 / 11:40