Eu encontrei algo similar. Um programa de watchdog simples que executa um serviço pela função exec. Você pode encontrá-lo aqui .
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?
Eu encontrei algo similar. Um programa de watchdog simples que executa um serviço pela função exec. Você pode encontrá-lo aqui .
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 ...).
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.
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.
#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.
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
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 ++.
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