LINUX

Cómo crear un demonio en Linux

La única diferencia entre estos procesos y el proceso normal es que no envían notificaciones a la consola ni a la pantalla de ninguna manera.Así es como puede crear un demonio en una máquina Linux.

Una breve introducción a cómo crear demonios.

Muchos demonios trabajan en el sistema y algunos ejemplos de demonios conocidos son los siguientes:

  1. crond: hace que los comandos se ejecuten en el momento especificado
  2. sshd: permite que las máquinas remotas inicien sesión
  3. httpd: proporcionar páginas web
  4. nfsd: permite compartir archivos a través de la red

Además, a menudo se hace referencia a los procesos demoníacos que terminan en la letra d, aunque esto es opcional.

Para iniciar el proceso como demonio, siga este procedimiento:

  1. Las operaciones iniciales, como la lectura de los archivos de configuración o la obtención de los recursos necesarios del sistema, deben realizarse antes de que el proceso se convierta en un demonio. Esto permite que el sistema informe los errores del usuario y el proceso finalizará con un código de error apropiado.
  2. Se crea un proceso en segundo plano con init como su proceso principal. Para este propósito, el proceso secundario se separa del primer proceso de inicio y luego se finaliza el proceso anterior.
  3. Se abrirá una nueva sesión llamando a la función setid y el proceso se desconectará de la terminal.
  4. Todos los descriptores de archivos abiertos heredados del proceso principal se cierran.
  5. Los mensajes estándar de entrada, salida y error se redirigen a /dev/null.
  6. El directorio de trabajo del proceso necesita ser cambiado.

¿Qué es una sesión Daemon?

Después de iniciar sesión a través de la terminal, el usuario puede ejecutar muchas aplicaciones a través del programa shell. Estos procesos se cerrarán cuando el usuario cierre la sesión. El sistema operativo agrupa estos procesos en grupos de sesiones y procesos.

Cada sesión consta de grupos de procesos. Esta situación se puede describir de la siguiente manera:


El terminal donde los procesos reciben su entrada y envían su salida se llama terminal de control Cada terminal de control está conectado a una sola sesión a la vez.

Grupos de sesión y procesos que tienen un ID. Estos identificadores son los identificadores de proceso (PID) del grupo líder de sesión y proceso. El proceso secundario comparte el mismo grupo que su proceso principal. Cuando varios procesos se comunican con el mecanismo del canal, el primer proceso se convierte en el líder del grupo de procesos.

Crear un proceso Daemon en Linux

Aquí verá cómo puede crear una función de daemon. Para hacer esto, creará una función llamada _daemon. Puede comenzar nombrando el código de la aplicación que se ejecutará como daemon test.c y el código que creará la función daemon con daemon.c.

//test.c #include int _daemon(int, int); int main() { getchar(); _daemon(0, 0); getchar(); return 0; }
//daemon.c #include 
      
        #include
       
         #include #include #include #include #include
        
          #include
         
           int _daemon(int nochdir, int noclose) { pid_t pid; pid = fork(); // Fork off the parent process if (pid  0) { exit(EXIT_SUCCESS); } return 0; }
         
        
       
      

Para crear un demonio, necesita un proceso en segundo plano cuyo padre sea init. En el código anterior, _daemon crea un proceso secundario y luego finaliza el proceso principal. En este caso, su nuevo proceso será un proceso secundario de init y continuará ejecutándose en segundo plano.

Ahora compila la aplicación con el siguiente comando y verifica el estado del proceso antes y después de llamar a _deamon:

gcc -o test test.c daemon.c

Inicie la aplicación y cambie a otro terminal sin presionar otra tecla:

./kiểm TRA

Puedes ver que los valores relacionados con tu progreso son los siguientes. Aquí deberá usar el comando ps para obtener información sobre el proceso. En este caso, la función _daemon aún no ha sido llamada.

ps -C test -o "pid ppid pgid sid tty stat command" # Output PID PPID PGID SID TT STAT COMMAND 10296 5119 10296 5117 pts/2 S+ ./test

Cuando mira el campo STAT, ve que su proceso se está ejecutando, pero esperando que suceda un evento no planificado que hará que se ejecute en primer plano.

Abreviatura sentido
S Estoy durmiendo esperando que suceda un evento
BILLONES La aplicación se detiene
S Líder de sesión
+ La aplicación se ejecuta en primer plano.

Puede ver que el proceso principal de la aplicación es el shell, como se esperaba.

ps -jp 5119 # Output PID PGID SID TTY TIME CMD 5119 5119 5117 pts/2 00:00:02 zsh

Ahora regrese a la terminal donde está ejecutando su aplicación y presione Entrar para llamar a la función _daemon. Luego revise la información de progreso en otro terminal.

ps -C test -o "pid ppid pgid sid tty stat command" # Output PID PPID PGID SID TT STAT COMMAND 22504 1 22481 5117 pts/2 S ./test

Primero, puede comprender que el nuevo proceso secundario se está ejecutando en segundo plano porque no ve el signo + en el campo STAT. Ahora veamos cuál es el proceso de crianza usando el siguiente comando:

ps -jp 1​​​​# Output PID PGID SID TTY TIME CMD 1 1 1 ? 00:00:01 systemd

Ahora puede ver que el proceso principal de su proceso es systemd. Se mencionó anteriormente que se abrirá una nueva sesión para el siguiente paso y el proceso debe desconectarse de la terminal de control. Para hacer esto, use la función setid. Agregue esta llamada a su función _daemon.

El código de adición es el siguiente:

if (setsid() == -1) return -1;

Una vez que haya verificado el estado antes de llamar a _daemon, ahora puede eliminar la primera función getchar en el código test.c.

//test.c #include int _daemon(int, int); int main() { _daemon(0, 0); getchar(); return 0; }

Luego de compilar y ejecutar nuevamente la aplicación, diríjase a la terminal donde realizó sus evaluaciones, el nuevo estado del proceso es el siguiente:

ps -C test -o "pid ppid pgid sid tty stat command"​​​​​# Output PID PPID PGID SID TT STAT COMMAND 25494 1 25494 25494 ? Ss ./test

¿Los símbolos? en el campo TT indica que tu proceso ya no está conectado al terminal. Tenga en cuenta que los valores de PID, PGID y SID en su proceso son los mismos. Su proceso ya es un líder de sesión.

en el siguiente paso cambie el directorio de trabajo del directorio raíz de acuerdo con el valor del argumento que pasó. Puede agregar el siguiente código a la función _daemon para esto:

if (!nochdir) { if (chdir("https://tipsmake.com/") == -1) return -1; }

Ahora, según el argumento, todos los descriptores de archivos se pueden cerrar. Agregue el siguiente código a la función _daemon:

#define NR_OPEN 1024 if (!noclose) { for (i = 0; i 

After all file descriptors are closed, new files opened by the daemon will be displayed with descriptors 0, 1 and 2 respectively. In this case, for example, the printf commands in the code will be redirected to the second file opened. To avoid this, the first 3 identifiers point to the device /dev/null.

In this case, the final state of the _daemon function will look like this:

#include 
      
        #include
       
         #include #include #include #include #include #include #include int _daemon(void) { // PID: Process ID // SID: Session ID pid_t pid, sid; pid = fork(); // Fork off the parent process if (pid  0) { exit(EXIT_SUCCESS); } // Create a SID for child sid = setsid(); if (sid 

Here is an example code that runs the sshd application as a daemon:

. if (!(debug_flag || inetd_flag || no_daemon_flag)) { int fd; if (daemon(0, 0) = 0) { (void) ioctl(fd, TIOCNOTTY, NULL); close(fd); } } .

Los demonios son programas que realizan varias acciones de una manera predefinida, ajustadas en respuesta a ciertos eventos. Se ejecutan en silencio en su máquina Linux. No están bajo el control directo del usuario y cada servicio en segundo plano tiene su propio demonio.

Es importante dominar los demonios para comprender la estructura del kernel del sistema operativo Linux y comprender cómo funcionan las diferentes arquitecturas del sistema.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba
error: Content is protected !!