Digamos que lanzo un montón de procesos desde una sesión ssh. ¿Es posible terminar la sesión ssh mientras se mantienen esos procesos ejecutándose en la máquina remota?
Digamos que lanzo un montón de procesos desde una sesión ssh. ¿Es posible terminar la sesión ssh mientras se mantienen esos procesos ejecutándose en la máquina remota?
Respuestas:
Debes buscar alternativas modernas como tmux.
tmuxes superior a screenpor muchas razones, aquí hay algunos ejemplos:
Para obtener la misma funcionalidad que se explica en la respuesta recomendada screen, deberá hacer lo siguiente:
tmuxescribiendo tmuxen el shelltmuxsesión iniciadatmuxsesión escribiendo Ctrl+ by luegod Ahora puede cerrar sesión de forma segura desde la máquina remota, su proceso seguirá ejecutándose dentro tmux. Cuando regrese de nuevo y desee verificar el estado de su proceso, puede usarlo tmux attachpara adjuntarlo a su tmuxsesión.
Si desea que se ejecuten varias sesiones en paralelo, debe nombrar cada sesión con Ctrl+ by $. Puede obtener una lista de las sesiones que se ejecutan actualmente utilizando tmux list-sessions, ahora adjunte a una sesión en ejecución con el comando tmux attach-session -t 0.
tmuxpuede hacer cosas mucho más avanzadas que manejar una sola ventana en una sola sesión. Para obtener más información echar un vistazo en el man tmuxo la página tmux GitHub . En particular, aquí hay una pregunta frecuente sobre las principales diferencias entre screeny tmux.
screen -x -r [screenname]o screen -rxpara abreviar si solo tiene una sesión de pantalla activa. Esto le permite adjuntar una instancia de pantalla existente.
Ctrl-by luego dpara salir / separar la tmuxsesión. Ciertamente, ese es el caso de la versión de tmuxen mi Ubuntu 12.04.
tmux detachlugar de escribirctrl-b d
nohupLa mejor manera es a menudo la más simple.
nohup long-running-command &
Fue hecho específicamente para esto, incluso registra registros estándar nohup.log.
man nohup
bgSi desea "en segundo plano" algunas tareas que ya se están ejecutando, su mejor opción es Ctrl+ y Zluego ejecutar
bg
para poner en segundo plano la tarea suspendida más reciente y permitirle seguir ejecutándose.
Luego, un rápido disowndebería mantener el proceso en ejecución después de cerrar sesión.
screeny otros pueden hacerlo, pero para eso no están. Recomiendo nohuppara tareas que sabe que va a dejar atrás y bgpara tareas que ya está ejecutando y no desea reiniciar.
Tenga en cuenta que ambos son específicos de bash. Si no está usando bash, entonces los comandos podrían ser diferentes.
disown -h
bg+ disownno funcionó para mí. Tenía un script de implementación ejecutándose. Olvidé comenzar dentro de tmux y necesitaba irme temprano para una reunión. El script genera continuamente progreso en el shell. ctrl+zdetuve el proceso y me devolvió a bash. bgreanudó el proceso, pero también reanudó la salida del estado a bash, por lo que es imposible ver lo que estaba escribiendo. Sin embargo, un disowncomando produjo "disown: current: no such job"
julia myFile.jlpor cualquier razón. tmux lo hace y es genial.
Podrías hacer eso usando screen.
Escriba man screenpara obtener más información o lea esta página de manual de la pantalla .
Escenario simple:
ssh en su caja remota. Escriba screenLuego comience el proceso que desee.
Presione Ctrl- Aluego Ctrl- D. Esto "separará" su sesión de pantalla pero dejará sus procesos en ejecución. Ahora puede cerrar sesión en la caja remota.
Si desea volver más tarde, inicie sesión nuevamente y escriba screen -rEsto "reanudará" su sesión de pantalla, y podrá ver el resultado de su proceso.
screen -S namepara que sea más fácil conectarme a la correcta más tarde.
screen -Santes de salir y screen -ral regresar es increíble!
Screen and nohup es la mejor manera, pero si tiene que separar un proceso que ya se está ejecutando sin screen o nohup, puede ejecutar el comando disown.
disown [-ar] [-h] [jobspec… |pid… ]Sin opciones, elimine cada especificación de trabajo de la tabla de trabajos activos. Si
-hse da la opción, el trabajo no se elimina de la tabla, sino que se marca para que SIGHUP no se envíe al trabajo si el shell recibe un SIGHUP. Si jobspec no está presente, y no se proporciona-ani la-ropción, se utiliza el trabajo actual. Si no se proporciona una especificación de trabajo , la-aopción significa eliminar o marcar todos los trabajos; la-ropción sin un argumento jobspec restringe la operación a trabajos en ejecución.
Con disown puedes cerrar la terminal y hacer que el proceso se ejecute en la máquina.
disown -a && exit
disowny lo mató.
Estaba atrapado en un gran MV, así que no estaba en condiciones de detener el proceso, configurar la pantalla y luego volver a iniciarlo. Logré salir de la sesión ssh con el proceso ejecutándose esencialmente haciendo los siguientes pasos:
El paso 3 pausa el proceso actual (por ejemplo, mi comando 'mv').
El paso 4 pone el proceso en pausa en segundo plano y lo reanuda.
El paso 5 te permite rechazar el proceso. ** Para obtener una lista de trabajos simplemente escriba jobsantes.
** Con respecto a disown (del manual bash):
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each jobspec from the table of active
jobs. If jobspec is not present, and neither the -a nor the -r
option is supplied, the current job is used. If the -h option
is given, each jobspec is not removed from the table, but is
marked so that SIGHUP is not sent to the job if the shell
receives a SIGHUP. If no jobspec is supplied, the -a option
means to remove or mark all jobs; the -r option without a job‐
spec argument restricts operation to running jobs. The return
value is 0 unless a jobspec does not specify a valid job.
disowncomando incorporado actúa en el trabajo en segundo plano más reciente.
Hay dos programas principales que puede usar para mantener los programas y el estado del terminal a través de múltiples conexiones ssh. Son de pantalla (el titular, pero desafortunadamente no se mantiene . Aparentemente se está desarrollando activamente ahora ) y tmux (más nuevo, mantenido activamente). Byobu es un front end que puede ejecutarse sobre estos sistemas y ofrecer información adicional sobre el estado de ubuntu. En las nuevas instalaciones, usará tmux como backend, si tiene una instalación anterior de byobu y una configuración existente mantendrá el backend anterior, ya sea screen o tmux.
Byobu se puede instalar en la computadora al hacerlo en una máquina basada en Debian:
sudo aptitude install byobu
Usando mmm, lo haces
su -c 'yum install byobu'
También es posible instalar byobu en otras distribuciones.
Puede iniciar byobu ejecutándose byobuen la máquina host después de conectarse usando ssh. Esto le dará un shell que se ve así:

También puede usar Byobu Terminal en una máquina Ubuntu con la opción -X y tener un byobu que funcione perfectamente.
Comience byobu escribiendo byobu.
Puede presionar F2 para crear una nueva ventana dentro de la sesión actual, F3-F4 para cambiar entre las diferentes ventanas.
La mejor parte de byobu es que no tienes que matar los procesos que se ejecutan en el terminal para abandonar el terminal. Simplemente puede enviar screen / tmux (el esqueleto de byobu) al fondo y reanudar la próxima vez que venga:
La próxima vez que vengas, solo hazlo byobuy deberías regresar a donde estabas.

También puede crear varias sesiones de byobu por byobu -S session1y así sucesivamente. Y puede conectarse a cualquiera de ellos cuando regrese.
Puedes hacer mucho más con Byobu. Úsalo! Algunas guías definitivas están aquí o aquí .
No puede hacer esto una vez que el proceso ha comenzado, debe haber configurado las cosas antes de ejecutar un trabajo de larga duración.
Puede usar nohup, pero la sabiduría moderna sugiere que use screen o byobu como inicio de sesión para que pueda separar y dejar las cosas en funcionamiento.
La pantalla tiene la ventaja de que puede desconectarse de una máquina y volver a conectarla a otra, lo cual es útil si desea verificar procesos de larga ejecución que se ejecutan más allá del final de la jornada laboral.
Hay una guía de inicio razonable para la pantalla aquí.
byobu pone una interfaz fácil de usar en la parte superior de la pantalla con menús, etc. También es la implementación actual de la pantalla en ubuntu más reciente. F2 para iniciar un nuevo terminal F3 / F4 para alternar y F6 para desconectar. Escriba exit para realmente terminar terminales permanentemente.
disownpara lograr esto. Ver la respuesta de @ bassgey
disowny si es necesario Ctrl-z, bgpara obtenerlo del terminal activo y en segundo plano. A continuación, disown.
Hola, si bien acepté que la pantalla es la opción más efectiva. Puede usar vncserver y luego iniciar el proceso en él.
Además, si su único interés es tener el proceso en ejecución y no es necesario recuperar el control, y lo más importante es que no estaba al tanto de que necesitará cerrar la sesión y ya tiene el proceso en ejecución, no tiene suerte si usaste bash como el caparazón
Primero debe enviar el proceso a segundo plano escribiendo Ctrl + Z seguido de bg% 1 (el número depende del número de trabajo, generalmente es 1, pero puede extraer fácilmente la lista usando los trabajos de comando)
Finalmente invoque el comando renegado (seguido del jobid ... igual que con el comando bg)
Esto eliminará la relación padre-hijo entre su shell y el proceso en segundo plano, evitando que muera cuando finalice su shell.
screenLa pregunta se planteó después del inicio de sesión, cómo mantener los procesos en ejecución, ahora después de iniciar sesión pero antes de iniciarlos. Gran respuesta Jorge, ¡realmente me has ayudado! :)
bg(sin %1) suele ser suficiente, ya que el trabajo predeterminado es el trabajo actual
Para un script de shell único que he estado ejecutando durante un largo período de tiempo, iniciaré sesión y ejecutaré el proceso en segundo plano usando '&'.
Ejemplo:
/path/to/my/script &
Me desconecté y desconecté mi sesión SSH. Cuando inicio sesión más tarde, el script todavía se está ejecutando, como lo demuestra la recopilación continua de datos del script.
&si cierra la sesión y accede a su sesión SSH, el proceso seguirá ejecutándose, sin embargo, no podrá ver la salida de ese proceso (si su script hizo eco de algo no lo verá, pero si escribe un archivo, el archivo estará allí)
Deberías revisar la pantalla GNU y ver si te ayuda. Dependiendo de cómo necesite que su aplicación se ejecute en tiempo real, puede causar más problemas de los que resuelve, pero al menos le permitirá reanudar su sesión como si nunca la abandonara.
Cómo utilizar :
screenpara el primer inicio, desplácese por los mensajes de introducción, debería recibir un terminal.screen -rpara reanudar esa sesión. Puede tener varias sesiones de pantalla separadas a la vez, en este caso se le mostrará una lista de sesiones disponibles.Hay muchas otras opciones, por ejemplo, pantallas divididas, y también todos los accesos directos son totalmente personalizables.
La respuesta más simple ...
Ctrl + Z suspenderá el programa en ejecución
"bg" lo ejecutará en segundo plano
disowno nohup), esto generalmente no mantendrá el proceso en ejecución después del final de la sesión SSH.
Si bien todos dicen usar disown(la única opción que tiene después de que ya comenzó el proceso), nohupo incluso ejecutar el comando screen, lo cual es útil si desea ver toda la salida del comando ... Soy fanático de screen.. Todavía he intentado las distribuciones mainstream más recientes de Linux y simplemente poner el trabajo en segundo plano y dejar de fumar no hace que todos los procesos que se están ejecutando mueran. Debe haber un entorno global o algo así. Estoy intentando esto en algunos sistemas bastante antiguos (slackware 12) y mi script de prueba sigue ejecutándose hasta que lo elimino manualmente:
shell$ cat > test.pl
#!/usr/bin/perl
while(1){
sleep(1);
}
shell$ perl ./test.pl &
shell$ exit
logout
shell$ ps aux test.pl
mymom 31337 1 0 13:25 ? 00:00:00 perl ./test.pl
shell$
Aunque estoy de acuerdo que screensería la mejor manera de manejar esto, aunque mi guión escribió a archivos o lo que sea .. nunca he necesitado utilizar ingrese disown -a o nohupmenos que estaba fuera de la paranoia completa. ¿Quizás alguien pueda arrojar algo de luz sobre cómo se comporta bash por defecto? ¿Quizás algunos administradores del sistema cambien los valores predeterminados en los shells grandes para evitar que los procesos de sus usuarios sobrecarguen el sistema?
Desafortunadamente, una sesión SSH terminada puede provocar que tmux o la pantalla se apaguen. Esto se debe a systemdque finalizará cualquier proceso secundario al cerrar sesión en una sesión.
Puede cambiar esta configuración en su logind.conf( /etc/systemd/logind.conf):
KillUserProcesses=no
Gracias por responder en https://unix.stackexchange.com/questions/490267 .
En vez de :
cmd options;
Añadir antes nohup:
nohup cmd options &
Luego, podrá ver la consola estándar mediante:
tail -f nohup.out