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+C
no parece detener nada, simplemente escribadisown;
y presione ciegamenteEnter
incluso 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 nohup
help disown
Diferencia 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 conbg
y luegodisown
, de esta manera:fuente
disown
no desconecta stdout o stderr. Sinnohup
embargo, 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
kate
proceso se separe dekonsole
cuando terminakonsole
, usenohup
con el comando, así:Después del cierre
konsole
,pstree
se verá así:y
kate
sobrevivirá :)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 process
Esto 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
screen
un 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_name
CtrlACCtrlA0CtrlA1screen -d -R session_name
fuente
screen -d -m command
lo 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
,inkscape
que 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
nohup
evita 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 llamadosession
que vive en miPATH
lista 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