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
.
tmux
es superior a screen
por muchas razones, aquí hay algunos ejemplos:
Para obtener la misma funcionalidad que se explica en la respuesta recomendada screen
, deberá hacer lo siguiente:
tmux
escribiendo tmux
en el shelltmux
sesión iniciadatmux
sesió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 attach
para adjuntarlo a su tmux
sesió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
.
tmux
puede 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 tmux
o la página tmux GitHub . En particular, aquí hay una pregunta frecuente sobre las principales diferencias entre screen
y tmux
.
screen -x -r [screenname]
o screen -rx
para abreviar si solo tiene una sesión de pantalla activa. Esto le permite adjuntar una instancia de pantalla existente.
Ctrl-b
y luego d
para salir / separar la tmux
sesión. Ciertamente, ese es el caso de la versión de tmux
en mi Ubuntu 12.04.
tmux detach
lugar de escribirctrl-b d
nohup
La 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
bg
Si 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 disown
debería mantener el proceso en ejecución después de cerrar sesión.
screen
y otros pueden hacerlo, pero para eso no están. Recomiendo nohup
para tareas que sabe que va a dejar atrás y bg
para 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
+ disown
no 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+z
detuve el proceso y me devolvió a bash. bg
reanudó 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 disown
comando produjo "disown: current: no such job"
julia myFile.jl
por cualquier razón. tmux lo hace y es genial.
Podrías hacer eso usando screen
.
Escriba man screen
para obtener más información o lea esta página de manual de la pantalla .
Escenario simple:
ssh en su caja remota. Escriba screen
Luego 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 -r
Esto "reanudará" su sesión de pantalla, y podrá ver el resultado de su proceso.
screen -S name
para que sea más fácil conectarme a la correcta más tarde.
screen -S
antes de salir y screen -r
al 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
-h
se 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-a
ni la-r
opción, se utiliza el trabajo actual. Si no se proporciona una especificación de trabajo , la-a
opción significa eliminar o marcar todos los trabajos; la-r
opció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
disown
y 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 jobs
antes.
** 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.
disown
comando 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 byobu
en 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 byobu
y deberías regresar a donde estabas.
También puede crear varias sesiones de byobu por byobu -S session1
y 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.
disown
para lograr esto. Ver la respuesta de @ bassgey
disown
y si es necesario Ctrl-z
, bg
para 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.
screen
La 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 :
screen
para el primer inicio, desplácese por los mensajes de introducción, debería recibir un terminal.screen -r
para 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
disown
o 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), nohup
o 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 screen
serí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 nohup
menos 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 systemd
que 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