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?
Uno de los siguientes 2 debería funcionar:
$ nohup redshift &
o
$ redshift &
$ disown
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)
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 con bgy luego disown, de esta manera:
$ sleep 1000
^Z
[1]+ Stopped sleep 1000
$ bg
$ disown
$ exit
disownno desconecta stdout o stderr. Sin nohupembargo, 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 ejecuta kate &en Konsole:
init-+
├─konsole─┬─bash─┬─kate───2*[{kate}]
│ │ └─pstree
│ └─2*[{konsole}]
Para hacer que el kateproceso se separe de konsolecuando termina konsole, use nohupcon el comando, así:
nohup kate &
Después del cierre konsole, pstreese verá así:
init-+
|-kate---2*[{kate}]
y katesobrevivirá :)
Una alternativa es usar screen/ tmux/ byobu, que mantendrá el shell en ejecución, independientemente del terminal.
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
nohup.out. 2) No permanece en la lista de trabajos de su shell, por lo que no satura la salida de jobs.
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_name
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:
command <&- &
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.
Tengo un script para:
Lo uso principalmente para gedit, etc. evince, inkscapeque tienen mucha salida de terminal molesta. Si el comando termina antes TIMEOUT, se devuelve el estado de salida de nohup en lugar de cero.
#!/bin/bash
TIMEOUT=0.1
#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!
#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally
#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS
ejemplos ...
>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail
Yo prefiero:
(Nombre de la aplicación &)
por ejemplo:
linux@linux-desktop:~$ (chromium-browser &)
¡Asegúrese de usar paréntesis cuando escriba el comando!
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:
nohup -p PID
Posiblemente similar a la respuesta ofrecida por apolinsky , utilizo una variante en screen. El comando vainilla es así
screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'
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 llamado sessionque vive en mi PATHlista para un acceso conveniente:
#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1
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 .
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:
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.