En Linux, quiero agregar un demonio que no se puede detener y que monitorea los cambios en el sistema de archivos. Si se detectan cambios, debe escribir la ruta a la consola donde se inició más una nueva línea.
Ya tengo el código de cambio del sistema de archivos casi listo, pero no puedo averiguar cómo crear un demonio.
Mi código es de aquí: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
¿Qué hacer después del tenedor?
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. Ver:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Respuestas:
Los demonios funcionan en segundo plano y (generalmente ...) no pertenecen a un TTY, por eso no puede usar stdout / stderr de la manera que probablemente desee. Por lo general, se utiliza un demonio syslog ( syslogd ) para registrar mensajes en archivos (depuración, error, ...).
Además de eso, hay algunos pasos necesarios para demonizar un proceso.
Si recuerdo correctamente estos pasos son:
Para darte un punto de partida: mira este código esqueleto que muestra los pasos básicos. Este código ahora también se puede bifurcar en GitHub: Esqueleto básico de un demonio de Linux
gcc -o firstdaemon daemonize.c
./firstdaemon
Compruebe si todo funciona correctamente:
ps -xj | grep firstdaemon
La salida debería ser similar a esta:
Lo que debería ver aquí es:
(debido a la segunda bifurcación ())
Leyendo el syslog:
/var/log/syslog
Haz una:
grep firstdaemon /var/log/syslog
La salida debería ser similar a esta:
Nota: en realidad, también querrá implementar un controlador de señales y configurar el registro correctamente (archivos, niveles de registro ...).
Otras lecturas:
fuente
fork()
, ¿por qué no usarlosetsid()
?sigaction()
función proporciona un mecanismo más completo y confiable para controlar señales; las nuevas aplicaciones deberían usar ensigaction()
lugar designal()
.man 7 daemon
describe cómo crear un demonio con gran detalle. Mi respuesta es solo un extracto de este manual.Hay al menos dos tipos de demonios:
Demonios SysV
Si está interesado en el demonio SysV tradicional , debe implementar los siguientes pasos :
Tenga en cuenta esta advertencia:
Tenga en cuenta que
daemon()
no es compatible con POSIX .Demonios de nuevo estilo
Para demonios de nuevo estilo, se recomiendan los siguientes pasos :
Para obtener más información, lea todo
man 7 daemon
.fuente
No puede crear un proceso en Linux que no se pueda matar. El usuario root (uid = 0) puede enviar una señal a un proceso y hay dos señales que no se pueden capturar, SIGKILL = 9, SIGSTOP = 19. Y otras señales (cuando no se detectan) también pueden provocar la terminación del proceso.
Es posible que desee una función de demonización más general, donde puede especificar un nombre para su programa / demonio y una ruta para ejecutar su programa (tal vez "/" o "/ tmp"). Es posible que también desee proporcionar archivo (s) para stderr y stdout (y posiblemente una ruta de control usando stdin).
Aquí están los incluidos necesarios:
Y aquí hay una función más general,
Aquí hay un programa de muestra, que se convierte en un demonio, se queda y luego se va.
Tenga en cuenta que SIG_IGN indica captar e ignorar la señal. Puede crear un manejador de señales que pueda registrar la recepción de señales y establecer banderas (como una bandera para indicar un apagado ordenado).
fuente
Intente usar la
daemon
función:Desde la página del manual :
fuente
daemon(7)
manual menciona los pasos para crear un demonio y advierte que: Ladaemon()
función BSD no debe usarse, ya que implementa solo un subconjunto de estos pasos.daemon
La función apareció por primera vez en 4.4BSD y no es compatible con POSIX .Puedo detenerme en el primer requisito "Un demonio que no se puede detener ..."
No es posible mi amigo; sin embargo, puede lograr lo mismo con una herramienta mucho mejor, un módulo del kernel.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Todos los demonios se pueden detener. Algunos se detienen más fácilmente que otros. Incluso una pareja de demonios con el compañero en espera, reapareciendo al compañero si se pierde, puede detenerse. Solo tienes que trabajar un poco más en eso.
fuente
Si su aplicación es una de:
y no le importa una dependencia de NodeJS, luego instale NodeJS y luego:
Para mantener todas las aplicaciones ejecutándose al reiniciar (y demonizar pm2):
Ahora usted puede:
(también le permite observar fácilmente los cambios de código en el directorio de su aplicación y reiniciar automáticamente el proceso de la aplicación cuando ocurre un cambio de código)
fuente
Al llamar a fork (), ha creado un proceso hijo. Si la bifurcación tiene éxito (la bifurcación devolvió un PID distinto de cero), la ejecución continuará desde este punto desde el proceso hijo. En este caso, queremos salir elegantemente del proceso padre y luego continuar nuestro trabajo en el proceso hijo.
Quizás esto ayude: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
fuente
Un demonio es solo un proceso en segundo plano. Si desea iniciar su programa cuando arranca el sistema operativo, en Linux, agregue su comando de inicio a /etc/rc.d/rc.local (ejecutar después de todos los demás scripts) o /etc/startup.sh
En Windows, crea un servicio, registra el servicio y luego lo configura para que se inicie automáticamente al arrancar en la administración -> panel de servicios.
fuente
Plantilla de demonio
Escribí una plantilla de demonio siguiendo el demonio de nuevo estilo: enlace
Puede encontrar el código de plantilla completo en GitHub: aquí
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
fuente