GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo bifurco un proceso que no muere cuando sale el shell?

El método más confiable parece ser:

(setsid emacs &)

Esto usa ( &) para bifurcarse al fondo, y setsid para separarse del tty de control.

Puede poner esto en una función de shell:

fork() { (setsid "[email protected]" &); }

fork emacs

Las posibilidades son:

  • El disown comando integrado:

    emacs &
    disown $!
    

    & actúa como separador de comandos y disown se establecerá de forma predeterminada en el trabajo más reciente, por lo que se puede acortar a:

    emacs & disown
    
  • Doble-fork() :

    (emacs &)
    

    Comandos entre paréntesis ( ) se ejecutan en un proceso de shell separado.

  • setsid , como lo sugiere Rich, podría ser la mejor opción, porque desactiva el TTY de control del proceso al crear una nueva sesión:

    setsid emacs
    

    Sin embargo, también es un poco impredecible:solo fork() en segundo plano si es el líder de un grupo de procesos (lo que no sucederá si setsid se usa en un sh guión, por ejemplo; en tales ocasiones, simplemente se volverá resistente a Ctrl-C).


No menciona si esto se ejecuta como una aplicación X o una aplicación de consola.

Si es como una aplicación de consola, por supuesto que debe cerrarse. Te deshiciste de su entrada/salida, más técnicamente el (pseudo) tty en el que estaba. Es muy poco probable que esto sea lo que quisiste decir, así que supongamos que estás hablando de una aplicación X.

nohup debería funcionar, no estoy seguro de por qué no lo es. Cuando el shell se cierra, envía SIGHUP a todos los procesos en su grupo de procesos. nohup le dice al comando que ignore SIGHUP.

También puede probar setsid, que desconecta el proceso del grupo de procesos

alias emacs='setsid emacs'

O agrega disown después de &


Verifique la configuración de su shell. También puedes probar screen en lugar de nohup .


Linux
  1. ¿Cómo ejecutar un script en Shell cuando se presiona una tecla de acceso directo?

  2. ¿Cómo iniciar todas las sesiones de Shell en un directorio que no sea $home?

  3. ¿Cómo recupero un semáforo cuando el proceso que lo redujo a cero falla?

  4. ¿Cuándo es útil setsid() o por qué necesitamos agrupar procesos en Linux?

  5. ¿Cómo obtener el código de salida del proceso generado en el script de shell esperado?

Cómo obtener PID del proceso secundario bifurcado en el script de shell

¿Se garantiza que un PID de proceso permanecerá igual siempre que el proceso no muera?

¿Hay alguna distribución de Linux o parche del kernel que borre un espacio de memoria del proceso después de que finalice el proceso?

¿Cómo ejecutar un script cuando llega un correo al servidor de correo? (Debian)

¿Cómo deshabilitar el apagado para que no se pueda interrumpir un proceso importante?

Linux - ¿Cómo puedo ver cuándo se inició un proceso?