Ejecuta un comando sin hacerme esperar

145

En la CLI, a veces un comando que escribo tarda un tiempo en completarse, y a veces sé cuándo está a punto de suceder. Estoy un poco confundido con el "fondo" y tal en Linux.

¿Cuál es la forma más común (o fácil de usar) de decirle a la CLI que no quiero esperar, devuélvame mi aviso de inmediato. Y si pudiera darme una barra de progreso o simplemente un hilado ocupado, ¡sería genial!

el espejo
fuente
3
Consulte también ¿Cómo enviar aplicaciones de línea de comandos directamente al fondo? si ya inició el comando y desea enviarlo a un segundo plano.
Gilles

Respuestas:

153

Antes de ejecutar el comando, puede agregar &la línea de comando para que se ejecute en segundo plano:

long-running-command &

Después de iniciar un comando, puede presionar CtrlZpara suspenderlo y luego bgponerlo en segundo plano:

long-running-command
[Ctrl+Z]
bg
Greg Hewgill
fuente
¿Utilicé el comando "find ~ / a.java &" pero no fui en segundo plano? Además, probé cmd + z (para mac) ... no funciona
Abhimanyu Aryan
1
@AbhimanyuAryan, tal vez quieras depurar tu find ...comando primero y luego ejecutarlo en segundo plano. En este caso te faltaba la -nameopción.
Alexis Wilke
113

Este es el favorito de todos, ya que además de enviar el proceso a un segundo plano, no tiene que preocuparse por la salida de texto que ensucia su terminal:

nohup command &

Esto no solo ejecuta el proceso en segundo plano, también genera un registro (llamado nohup.outen el directorio actual, si eso no es posible, su directorio de inicio) y si cierra / cierra el shell actual, el proceso no se detiene al evitar que el proceso secundario reciba el padre señala cuando se mata (es decir, cerrar sesión, mediante SIGHUP al padre, o cerrar el shell actual).

Hay otro llamado, disownpero es más bien una extensión de otras respuestas en lugar de un método en sí mismo:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Estos comandos no le permiten recuperar fácilmente los resultados del proceso a menos que use una forma hack para hacerlo.

Braiam
fuente
44
Sysadmin desde el '95. Nunca escuché de disown hasta hoy, ¡gracias! Sin embargo, no funciona con todos los shell (comprobado bash, zsh, tcsh. Tcsh no funcionó).
yoonix
Usarlo nohupen un shell de control de trabajo es una tontería. Los proyectiles modernos no se envían HUPa procesos en segundo plano. Redirigir a un nombre de archivo único es un pequeño precio a pagar.
pollitos
@chicks, el caso de uso aquí es evitar que stderr y stdout contaminen el terminal con la ventaja de que crea un archivo de registro automáticamente.
Braiam el
1
command > file.log 2>&1 & disownes un poco más largo que, nohup command &pero supongo que eso es lo que @chicks estaba sugiriendo.
joeytwiddle
32

Esto es probablemente lo que quieres

my_command > output.log 2>&1 &

Esto iniciará su comando, redirigiendo tanto stdout como stderr a algunos output.logque puede especificar. Si no le importa almacenar la salida, puede usarla en /dev/nulllugar de un archivo real.

&ejecutará el comando en segundo plano para que pueda continuar ingresando comandos mientras se está ejecutando. 2>&1redirige stderr a stdout para que se capture toda la salida.

Además, cuando ejecuta un comando como este, debe obtener una confirmación del núcleo similar a la siguiente: [2] 1234 Esto significa que su proceso se está ejecutando en segundo plano y su ID es 1234, por lo que puede matarlo más tarde si lo desea conkill -9 1234

travnik
fuente
2
gracias, 2>&1es muy importante porque el comando puede fallar e intentarlo generar el error en algunos casos.
ericn
1
Este funcionó cuando las respuestas anteriores no dieron las gracias.
Domagoj
9

Mira en la pantalla o tmux . Un ejemplo con tmux:

$ tmux new -d 'longrunningcommand'

Si bien las otras respuestas que usan '&' a fondo funcionarán, debe redirigir stdout (¡y stderr!). Sin hacer eso, la salida irá directamente a su shell, mezclándose con cualquier otra salida que pueda tener.

El fondo también fallará si está ejecutando un comando largo y cierra la sesión o se desconecta. El sistema matará tu trabajo.

Si no está familiarizado con screen o tmux, básicamente le permiten desconectarse por completo de su shell. En lugar de poner en segundo plano su programa, pone en segundo plano todo el shell. Luego puede volver a él más tarde, incluso desde otra computadora. Ambos tienen muchas más funciones que pueden ser útiles o no más allá de este caso de uso.

Screen es el viejo programa probado y verdadero; tmux es mucho más joven pero ha aprendido del pasado de la pantalla.

yoonix
fuente
Esta respuesta pierde una respuesta real y suena como un RTFM.
Lloeki
5

(Para completar, ya respondió :) Pones un comando en segundo plano agregando &después del comando:

long_command with arguments > redirection &

Estoy agregando esta respuesta para abordar la otra parte de su pregunta:

No existe un equivalente real del control giratorio para mostrar comandos de fondo en progreso, pero puede ver el estado de los comandos de fondo escribiendo jobso jobs -l. Le mostrará sus comandos en segundo plano, y si están ejecutándose, detenidos por señal (por ejemplo, con ^Z) u ocasionalmente detenidos porque están esperando una entrada interactiva de usted.

alexis
fuente
long_command with arguments &> redirection &para redirigir el stderrtambién
Ice-Blaze
3

Puede ejecutar un programa en segundo plano usando &. Por ejemplo, si desea ejecutar, yum install XyZpor ejemplo, puede ejecutar:

yum install XyZ &

El stdouto la salida del programa se puede redirigir utilizando >para sobrescribir un archivo o >>para agregarlo a un archivo. Por ejemplo, si desea iniciar sesión yumen un archivo yum.log:

yum install XyZ > yum.log &

O, si desea agregar la salida a un archivo existente log:

yum install XyZ >> log &

Los errores se imprimen stderry no stdout, y se pueden redirigir a un archivo de la misma manera, pero usando 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Si desea redirigir ambos stderry stdout, puede usar &>:

yum install XyZ &> output
yum install XyZ &>> output
Davidson Chua
fuente
2

Puede ejecutar un comando en segundo plano simplemente colocando un &signo después.

Por ejemplo:

areallylong_command &

lo ejecutará en segundo plano.

Puede redirigir aún más el stdout / stderr a los archivos apropiados para que no aparezcan en su terminal mientras está haciendo algo.

Consulte esto para obtener más información: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

mkc
fuente
0

Intente usar el comando 'pantalla' antes de comenzar su tarea de ejecución prolongada, luego, cuando se desconecte, puede volver a conectarla con 'pantalla -r -d' cuando lo necesite nuevamente. Encuentro que cuando se usa un terminal a través de ssh u otras conexiones de red, a veces pueden romperse por una mala conexión al servidor. ejecutarlo dentro de una 'pantalla' soluciona este problema.

meaje
fuente