Datos de la consola del proceso del daemon de acceso de Linux

  
linux proporciona una función de demonio, de modo que el proceso puede ejecutarse fuera de la consola, para lograr el efecto de ejecución en segundo plano. Sin embargo, después de que el proceso se ejecute en segundo plano, los datos que se emitieron originalmente en la consola del terminal no serán visibles. Entonces, ¿cómo puedo recuperar estos datos? Aquí, el tema del artículo gira en torno a cómo obtener los datos de la consola del proceso en segundo plano, cuyo principio debe comenzar desde el daemon. El demonio hace principalmente dos cosas: 1. Crear un proceso secundario, salir del proceso actual y crear una nueva sesión como un proceso secundario. Por lo tanto, incluso si el proceso principal se cierra, el proceso secundario no se cerrará.

2. La entrada estándar, la salida estándar y el error estándar se redirigen a /dev /null

La implementación del daemon es aproximadamente como sigue:
< pre> int daemonize (int nochdir, int noclose) {int fd; conmutador (tenedor ()) {case -1: return (-1), y caso 0: break; por defecto: _exit (EXIT_SUCCESS);} if (setsid () == -1) return (-1); if (nochdir == 0) {if (chdir (" /") = 0) {perror (" chdir "); return (-1);}} si (noclose == 0 &&(fd = open ("! /dev /null ", O_RDWR, 0)) = -1) {if (dup2 (fd, STDIN_FILENO) < 0) {perror (" dup2 stdin "); retorno (-1);} if (dup2 (fd, STDOUT_FILENO) < 0) {perror (" stdout dup2 "); retorno (-1);} if (dup2 (fd, STDERR_FILENO) < 0) {perror (" stderr dup2 "); retorno (-1);} if (fd > {if (close (fd STDERR_FILENO)) < 0) {perror (" cerca "); retorno ( -1);}}} return (0);} Entonces, si desea recuperar los datos de la consola del proceso, simplemente coloque la salida estándar El error estándar se redirige al archivo especificado, y luego leer el archivo bien. Aquí artículo escrito ejemplo, la simple presentación (aquí, el proceso de comunicación se completa con una señal kill, algo más dura) código es el siguiente, guardado como daemon_example.c

 #include #include #include #include static int fd = -1; sigroutine void (int dunno) {switch (¡no sé) {case SIGUSR1: fprintf (stderr, " Obtener una señal - SIGUSR1 \\ n "); if (! fd = -1) cerca (fd); fd = open (" /Tmp /console_temp.log ", O_RDWR |
 O_APPEND |
 O_CREAT, 0600), si (fd == -1) break; dup2 (fd, STDIN_FILENO); dup2 (fd, STDOUT_FILENO); dup2 (fd, STDERR_FILENO); romper; caso SIGUSR2: fprintf (stderr, " Obtener una señal ! - SIGUSR2 \\ n "), si (fd = -1) cerca (fd); fd = open (" /dev /null ", O_RDWR, 0), si (fd == -1) break; dup2 ( fd, STDIN_FILENO); dup2 (fd, STDOUT_FILENO); dup2 (fd, STDERR_FILENO); break;} return;} int main () {señal (SIGUSR1, sigroutine); señal (SIGUSR2, sigroutine); daemon (1,0); for (;;) {fprintf (stderr, " test \\ n "); //continuar el sueño prueba de impresión (1);} return 0;} a continuación, compilar y ejecutar este programa: $ gcc -o daemon_example daemon_example.c $ chmod + x daemon_example $ ./daemon_example $ ps -ef |
  ? Grep raíz daemon_example 11328 1 0 19:15 00:00:00 ./daemon_example anteriormente, un proceso que se ejecuta en segundo plano, la EIP 11328 A continuación, escribir un guión para probar el programa, guardarlo como test.sh :! 
 # /bin /bashpid = $ 1PS -p $ pid > /dev /NULLIF [$ -eq 0 !?]; then echo pid no existe salida 1fiecho pid $ pidtrap "! matar -usr2 $ pid &&salida 1 " ! HUP INT SALIR TERMkill -USR1 $ pidecho funciona, por favor wait..sleep 1tail -f -n 0 /tmp/console_temp.logecho hecho para ejecutar la secuencia de comandos con los siguientes resultados: $ ./test.sh 11328 11328 PID funciona, por favor Espere .. prueba de prueba Luego, presione ctrl + c para salir del script. El script le dirá al proceso que redirija la salida estándar y el error estándar a /dev /null y continúe ejecutándose en segundo plano. De esta manera, este script se convierte en una herramienta de depuración para el proceso en segundo plano. Debe ejecutarse cuando se necesitan los datos en segundo plano y no es necesario cerrarlos. Por supuesto, esto es solo un ejemplo. En las aplicaciones reales, se deben realizar mejoras, como cambiar la señal de desactivación a la comunicación de tubería o socket, limitar el tamaño del archivo de caché o borrarlo automáticamente. Al final del artículo, ¿es un poco complicado, qué mejor manera tienes, bienvenido comentarios e intercambios!
						
Copyright © Conocimiento de Windows All Rights Reserved