¿Cómo puedo poner en segundo plano el proceso de Linux en ejecución actual? [cerrado]

111

Tengo un comando que carga archivos usando git a un servidor remoto desde el shell de Linux y tardará muchas horas en finalizar.

¿Cómo puedo poner ese programa en ejecución en segundo plano? ¿Para que todavía pueda trabajar en shell y ese proceso también se complete?

Espejismo
fuente
Solo una suposición, pero ¿probaste ctrl + z o ejecutaste tu comando así? #command &
EralpB
El comando ya se está ejecutando, así que no tengo otra opción. No estoy seguro de qué comando probar. No quería romper el proceso actual, así que no lo experimenté
Mirage
Deberíamos esperar una respuesta más profesional entonces :) Me refiero a si tuvieras la oportunidad de empezar de nuevo. (El comando y la cosa)
EralpB
El respondedor aceptado en esta pregunta explica los tres pasos que se deben seguir: stackoverflow.com/questions/625409/…
Leonard Saers
También puede abrir una segunda instancia de putty y volver a conectarse al servidor para obtener otro shell. Aunque la solución con ctrl+zes genial.
Ela782

Respuestas:

207

Suspenda el proceso con CTRL + Z y luego use el comando bgpara reanudarlo en segundo plano. Por ejemplo:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

Más sobre el control y bguso del trabajo en bashla página del manual:

CONTROL DE TRABAJO
Escribir el carácter de suspensión (típicamente ^ Z, Control-Z) mientras se ejecuta un proceso hace que ese proceso se detenga y devuelve el control a bash. [...] El usuario puede entonces manipular el estado de este trabajo, usando el comando bg para continuarlo en segundo plano, [...]. A ^ Z entra en vigencia inmediatamente y tiene el efecto secundario adicional de hacer que se descarten los resultados pendientes y la escritura anticipada.

bg [ jobspec ...]
Reanuda cada trabajo suspendido jobspec en segundo plano, como si se hubiera iniciado con &. Si jobpec no está presente, se utiliza la noción de shell del trabajo actual .

EDITAR

Para iniciar un proceso en el que incluso puede matar la terminal y aún sigue ejecutándose

nohup [command] [-args] > [filename] 2>&1 &

p.ej

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Para simplemente ignorar la salida (no muy inteligente), cambie el nombre del archivo a /dev/null

Para que el mensaje de error se establezca en un archivo diferente, cambie &1a un nombre de archivo.

Además: puede usar el jobscomando para ver una lista indexada de esos procesos en segundo plano. Y puede eliminar un proceso en segundo plano ejecutándolo kill %1o kill %2con el número como índice del proceso.

Ed Heal
fuente
Lo probé, pero como está generando algo, nuevamente aparece en primer plano con% mostrando cuántos datos se cargan
Mirage
El proceso escribirá cualquier salida en la terminal como le indicó al proceso que lo hiciera al principio. Tendrá que reiniciarlo para obtener la salida para escribir en el archivo o /dev/null. Ver edición arriba.
Ed Heal
lo que significa que, si el proceso ya se inició, no hay forma de redirigir la salida
Mirage
Sí, claro. No puede efectuar el proceso solo en el shell desde el que se ejecuta. Puede hacer un kill -9 <pid of your shelly luego el proceso aún se ejecutará y la salida se descartará, pero tendrá que iniciar sesión nuevamente para iniciar un nuevo shell.
Ed Heal
También puede usar el disowncomando si necesita cerrar la sesión de su terminal y desea que continúe ejecutándose.
kirk roerig