No Linux, quero adicionar um daemon que não pode ser interrompido e que monitora as mudanças no sistema de arquivos. Se alguma mudança for detectada, ele deve escrever o caminho para o console onde foi iniciado mais uma nova linha.
Eu já tenho o código de alteração do sistema de arquivos quase pronto, mas não consigo descobrir como criar um daemon.
Meu código é daqui: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
O que fazer depois da bifurcação?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
inotify
API. Veja:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Respostas:
Daemons funcionam em segundo plano e (geralmente ...) não pertencem a um TTY, por isso você não pode usar stdout / stderr da maneira que provavelmente deseja. Normalmente, um daemon syslog ( syslogd ) é usado para registrar mensagens em arquivos (depuração, erro, ...).
Além disso, existem algumas etapas necessárias para daemonizar um processo.
Se bem me lembro, essas etapas são:
Para lhe dar um ponto de partida: Observe este código-esqueleto que mostra as etapas básicas. Este código agora também pode ser bifurcado no GitHub: esqueleto básico de um daemon do Linux
gcc -o firstdaemon daemonize.c
./firstdaemon
Verifique se tudo está funcionando corretamente:
ps -xj | grep firstdaemon
A saída deve ser semelhante a esta:
O que você deve ver aqui é:
(por causa da segunda bifurcação ())
Lendo o syslog:
/var/log/syslog
Faça um:
grep firstdaemon /var/log/syslog
A saída deve ser semelhante a esta:
Uma nota: na realidade, você também gostaria de implementar um manipulador de sinal e configurar o registro corretamente (arquivos, níveis de registro ...).
Leitura adicional:
fonte
fork()
, por que não apenas usarsetsid()
?sigaction()
função fornece um mecanismo mais abrangente e confiável para controlar sinais; novos aplicativos devem usar emsigaction()
vez designal()
.man 7 daemon
descreve como criar daemon em grandes detalhes. Minha resposta é apenas um trecho deste manual.Existem pelo menos dois tipos de daemons:
SysV Daemons
Se você estiver interessado no daemon SysV tradicional , deverá implementar as seguintes etapas :
Observe este aviso:
Observe que
daemon()
não é compatível com POSIX .Daemons de novo estilo
Para daemons de novo estilo, as seguintes etapas são recomendadas:
Para saber mais, leia na íntegra
man 7 daemon
.fonte
Você não pode criar um processo no Linux que não possa ser eliminado. O usuário root (uid = 0) pode enviar um sinal para um processo, e há dois sinais que não podem ser capturados, SIGKILL = 9, SIGSTOP = 19. E outros sinais (quando não capturados) também podem resultar no encerramento do processo.
Você pode querer uma função daemonize mais geral, onde você pode especificar um nome para seu programa / daemon e um caminho para executar seu programa (talvez "/" ou "/ tmp"). Você também pode querer fornecer arquivo (s) para stderr e stdout (e possivelmente um caminho de controle usando stdin).
Aqui estão os itens necessários:
E aqui está uma função mais geral,
Aqui está um programa de amostra, que se torna um daemon, fica pendurado e depois sai.
Observe que SIG_IGN indica para capturar e ignorar o sinal. Você pode construir um manipulador de sinal que pode registrar o recebimento do sinal e definir sinalizadores (como um sinalizador para indicar desligamento normal).
fonte
Tente usar a
daemon
função:Na página de manual :
fonte
daemon(7)
manual menciona etapas para criar daemon e avisa que: Adaemon()
função BSD não deve ser usada, pois implementa apenas um subconjunto dessas etapas.daemon
A função apareceu pela primeira vez no 4.4BSD e não é compatível com POSIX .Posso parar no primeiro requisito "Um daemon que não pode ser interrompido ..."
Não é possível meu amigo; entretanto, você pode conseguir o mesmo com uma ferramenta muito melhor, um módulo de kernel.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Todos os daemons podem ser interrompidos. Alguns são interrompidos mais facilmente do que outros. Mesmo um par de daemons com o parceiro em espera, renascendo o parceiro se perdido, pode ser interrompido. Você apenas tem que trabalhar um pouco mais para isso.
fonte
Se seu aplicativo for um dos seguintes:
e você não se importa com uma dependência do NodeJS, instale o NodeJS e:
Para manter todos os aplicativos em execução na reinicialização (e daemonise pm2):
Agora você pode:
(também permite que você observe facilmente as alterações de código no diretório do seu aplicativo e reinicie automaticamente o processo do aplicativo quando uma alteração de código acontecer)
fonte
Ao chamar fork (), você criou um processo filho. Se a bifurcação for bem-sucedida (bifurcação retornou um PID diferente de zero), a execução continuará a partir desse ponto de dentro do processo filho. Nesse caso, queremos sair normalmente do processo pai e, em seguida, continuar nosso trabalho no processo filho.
Talvez isso ajude: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
fonte
Um daemon é apenas um processo em segundo plano. Se você deseja iniciar seu programa quando o sistema operacional inicializa, no linux, você adiciona seu comando de inicialização a /etc/rc.d/rc.local (executa após todos os outros scripts) ou /etc/startup.sh
No Windows, você cria um serviço, registra o serviço e então o configura para iniciar automaticamente na inicialização em administração -> painel de serviços.
fonte
Daemon Template
Eu escrevi um modelo de daemon seguindo o daemon de novo estilo: link
Você pode encontrar o código do modelo completo no GitHub: aqui
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
fonte