A veces quiero comenzar un proceso y olvidarlo. Si lo inicio desde la línea de comando, así:
redshift
No puedo cerrar la terminal, o matará el proceso. ¿Puedo ejecutar un comando de tal manera que pueda cerrar el terminal sin matar el proceso?
A veces quiero comenzar un proceso y olvidarlo. Si lo inicio desde la línea de comando, así:
redshift
No puedo cerrar la terminal, o matará el proceso. ¿Puedo ejecutar un comando de tal manera que pueda cerrar el terminal sin matar el proceso?
yourExecutable &y las salidas siguen apareciendo en la pantalla yCtrl+Cno parece detener nada, simplemente escribadisown;y presione ciegamenteEnterincluso si la pantalla se desplaza con las salidas y no puede ver qué estas escribiendo El proceso será desautorizado y podrá cerrar la terminal sin que el proceso muera.Respuestas:
Uno de los siguientes 2 debería funcionar:
o
Consulte lo siguiente para obtener un poco más de información sobre cómo funciona esto:
man nohuphelp disownDiferencia entre nohup, disown y & (asegúrese de leer los comentarios también)
fuente
redshift & disown) funcionó para mí en Ubuntu 10.10. Parece funcionar bien poner todo en una línea. ¿Hay alguna razón por la que no debería hacer esto?nohup redshift &por lo que lo hace de fondo). Y poner el segundo en una línea está bien, aunque generalmente se separa con;(redshift &; disown);y&son separadores de comandos y tienen la misma precedencia. La única diferencia es la ejecución síncrona versus asíncrona (respectivamente). No es necesario usarlo&;con preferencia&(solo funciona, pero es un poco redundante).redshift &!desconocerá el desplazamiento al rojo inmediatamente.Si su programa ya se está ejecutando , puede pausarlo
Ctrl-Z, ponerlo en segundo plano conbgy luegodisown, de esta manera:fuente
disownno desconecta stdout o stderr. Sinnohupembargo, al igual que>/dev/null(desconecta la salida estándar),2>/dev/null(desconecta el error estándar). (disown) Desconecta el control de trabajo.@StevenD ya ha publicado una buena respuesta, pero creo que esto podría aclararlo un poco más.
La razón por la que el proceso se interrumpe al terminar el terminal es porque el proceso que inicia es un proceso secundario del terminal. Una vez que cierre la terminal, esto también eliminará estos procesos secundarios. Puede ver el árbol de procesos con
pstree, por ejemplo, cuando se ejecutakate &en Konsole:Para hacer que el
kateproceso se separe dekonsolecuando terminakonsole, usenohupcon el comando, así:Después del cierre
konsole,pstreese verá así:y
katesobrevivirá :)Una alternativa es usar
screen/tmux/byobu, que mantendrá el shell en ejecución, independientemente del terminal.fuente
Puedes ejecutar el proceso así en la terminal
setsid processEsto ejecutará el programa en una nueva sesión. Como se explica http://hanoo.org/index.php?article=run-program-in-new-session-linux
fuente
nohup.out. 2) No permanece en la lista de trabajos de su shell, por lo que no satura la salida dejobs.Aunque todas las sugerencias funcionan bien, he encontrado que mi alternativa es usar
screenun programa que configura un terminal virtual en su pantalla.Puede considerar comenzarlo con . Screen se puede instalar en prácticamente todos los derivados de Linux y Unix. Al presionar + y (minúsculas) comenzará una segunda sesión. Esto le permitirá alternar entre la sesión inicial presionando + y / o la sesión más nueva presionando + y . Puede tener hasta diez sesiones en una terminal. Solía comenzar una sesión en el trabajo, ir a casa, ingresar a mi máquina de trabajo y luego invocar . Esto lo reconectará a esa sesión remota.
screen -S session_nameCtrlACCtrlA0CtrlA1screen -d -R session_namefuente
screen -d -m commandlo iniciará dentro de la pantalla ya separada:~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x... y ya está.La forma única de hacer todo esto es cerrar stdin y poner en segundo plano el comando:
Entonces no se cerrará cuando salga del shell. Redirigir stdout es una buena opción opcional para hacer.
La desventaja es que no puedes hacer esto después del hecho.
fuente
Tengo un script para:
Ejecute comandos arbitrarios en segundo plano
Evita que sean asesinados con la ventana de terminal
Suprimir su salida
Maneja el estado de salida
Lo uso principalmente para
gedit, etc.evince,inkscapeque tienen mucha salida de terminal molesta. Si el comando termina antesTIMEOUT, se devuelve el estado de salida de nohup en lugar de cero.ejemplos ...
fuente
Yo prefiero:
(Nombre de la aplicación &)
por ejemplo:
linux@linux-desktop:~$ (chromium-browser &)¡Asegúrese de usar paréntesis cuando escriba el comando!
fuente
nohupevita cualquier salida de tty y en realidad solo quería redirigir la salida a un archivo y lo evitó, por lo que esta es la mejor solución para mí.Puede configurar un proceso (PID) para que no reciba una señal HUP al cerrar sesión y cerrar la sesión del terminal. Use el siguiente comando:
fuente
Posiblemente similar a la respuesta ofrecida por apolinsky , utilizo una variante en
screen. El comando vainilla es asíLa sesión se puede desconectar Ctrl ACtrl Dy volver a conectar en el caso simple con
screen -r. Tengo esto envuelto en un script llamadosessionque vive en miPATHlista para un acceso conveniente:Esto solo funciona cuando sabe de antemano que desea desconectar un programa. No proporciona la desconexión de un programa que ya se está ejecutando .
fuente
De manera similar a otras respuestas publicadas anteriormente, uno puede transferir un proceso en ejecución para usar "pantalla" retrospectivamente gracias a reptyr y luego cerrar el terminal. Los pasos se describen en esta publicación . Los pasos a seguir son:
fuente