¿Cómo poner un trabajo en segundo plano sin salida?

Cuando pongo un trabajo en segundo plano con el command bg , tengo el resultado del command del trabajo.

¿Cómo poner el trabajo en segundo plano (como el command bg ) pero sin ningún resultado?

PD: el trabajo está vinculado a un command con una salida (no hay >/dev/null 2>1 en el command original)

Debes indicarle a la aplicación que ya está en segundo plano que deje de escribir en el dispositivo tty. No hay una forma genérica de hacerlo.

Tu puedes hacer:

 stty tostop 

hacer para que los trabajos en segundo plano se suspendan (con una señal SIGTTOU ) cuando intenten escribir en el tty.

Puede adjuntar un depurador al process y hacerlo volver a abrir los descriptores de file que ha abierto en el dispositivo tty a /dev/null . Me gusta (aquí solo para stdout):

 gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid" 

(suponiendo que la aplicación está vinculada dinámicamente o tiene símbolos de debugging y tenga en count que algunos sistemas tendrán restricciones de security que le impiden hacerlo).

Para las aplicaciones vinculadas dinámicamente, puede ejecutarlas con un blob LD_PRELOAD que instala un controller en SIGTTOU (y realiza el stty tostop ) que vuelve a abrir stdout y stderr en /dev/null si iban a un terminal. Eso manejaría el caso de las aplicaciones no setuid / setgid que escriben en el terminal a través de stdout / stderr y no manejan el SIGTTOU ellos mismos.

Correr:

  gcc -Wall -shanetworking -fPIC -nostartfiles -o ~/lib/handle_tostop.so handle_tostop.c 

Donde handle_tostop.c contiene:

 #include <signal.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> static void reopen_on_null(int req_fd) { int fd; if (close(req_fd) == 0) { fd = open("/dev/null", O_RDWR); if (fd != req_fd && fd >= 0) { dup2(fd, req_fd); close(fd); } } } static void handle_sigttou(int sig) { if (isatty(1)) reopen_on_null(1); if (isatty(2)) reopen_on_null(2); } void _init() { signal(SIGTTOU, handle_sigttou); } 

Y entonces:

 LD_PRELOAD=~/lib/handle_tostop.so export LD_PRELOAD stty tostop 

En lugar de /dev/null , es posible que desee networkingirigir el resultado a algún file de logging (que luego podría querer abrir con O_APPEND , y posiblemente incluya el pid del process en el nombre del file para saber de qué process proviene el resultado ) por lo que no se descarta si te sirve.

Si usa nohup, sus trabajos se ejecutarán en segundo plano, pero esto creará un resultado automático (nohup.out).

Intereting Posts