Pregunta ¿Puedo nohup / screen un proceso ya iniciado?


Estoy haciendo algunas pruebas de ejecución de scripts de migración de datos de larga ejecución, a través de SSH. Digamos que empiezo a ejecutar un script alrededor de las 4 PM; ahora, las 6 de la tarde se dan vuelta, y me estoy maldiciendo por no hacer todo esto screen.

¿Hay alguna manera de "retroactivamente" nohup ¿Un proceso, o necesito dejar mi computadora en línea toda la noche? Si no es posible adjuntar screen a/nohup un proceso que ya comencé, entonces ¿por qué? ¿Algo relacionado con cómo interactúan los procesos padre / hijo? (No aceptaré una respuesta de "no" que al menos no aborde la pregunta de 'por qué' - lo siento;))


247
2018-06-11 22:53


origen


Acabo de ver una interesante entrada de blog sobre disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the - ojrac


Respuestas:


Si estás usando Bash, puedes correr disown -h job

desconocer

disown [-ar] [-h] [jobspec ...]

Sin opciones, cada especificación de trabajo se elimina de la tabla de trabajos activos.   Si el -h Se da opción, el trabajo.   no se elimina de la tabla, pero es   marcado para que SIGHUP no se envíe a   el trabajo si el shell recibe una   SIGHUP. Si jobpec no está presente, y   ni el -a ni -r la opción es   suministrado, se utiliza el trabajo actual. Si   no se proporciona ningún trabajo, la -a   opción significa eliminar o marcar todos   trabajos; la -r opción sin un   El argumento de Jobpec restringe la operación   para ejecutar trabajos.


200
2018-06-11 23:03



Increíble; Esperaba que algo como esto apareciera. - ojrac
La vida puede ser injusta. gharper y yo publicamos esto casi al mismo tiempo :) - serverhorror
Eres mi héroe - Thomas Dignan
El rechazo no es específico para golpear. También está en zsh, ksh93, ... - Phil P
Encontré que realmente tienes que usar disown %1 si 1 es la especificación de trabajo, a diferencia de fg o bg donde solo usas bg 1  serverwatch.com/tutorials/article.php/3935306/… - mltsy


Utilizar reptyr

Desde el README:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Algunas publicaciones del blog de su autor:


77
2018-05-22 21:27



Voy a seguir con las herramientas integradas (es decir, no está disponible), pero no es tan flexible como reptyr. +1 - ojrac


Para robar un proceso de un tty a su tty actual, es posible que desee probar este truco:

http://www.ucc.asn.au/~dagobah/things/grab.c

Necesita un cambio de formato para compilar a las versiones actuales de Linux / glibc, pero aún funciona.


22
2018-06-12 05:38



Excepcionalmente fresco - ojrac


Cuando se inicia un proceso, STDIN, STDOUT y STDERR se conectan a alguna cosa. Generalmente no puedes cambiar eso una vez que se inicia el comando. En el caso que está describiendo, eso es probablemente un tty asociado con la sesión ssh. nohup prácticamente lo hace ...

command < /dev/null > nohup.out 2>&1

Es decir, establece STDIN en / dev / null, STDOUT en un archivo y STDERR en STDOUT. La pantalla hace cosas mucho más sofisticadas que involucran la configuración de ttys que se dirigen a sí mismos.

No sé de ninguna manera retroactivamente para nohup o tamizar un proceso en ejecución. Si cd a / proc / $ pid / fd y ve a qué apuntan 0, 1 y 2.

Podría tener algo de suerte con el rechazo, pero no si el proceso intenta hacer algo con STDIN, STDOUT o STDERR.


16
2018-06-11 23:04



+1 por los buenos comentarios. st (din | out | err) es la otra mitad del problema, y ​​agradezco los consejos sobre dónde empezar a buscar, la próxima vez que esté en este atasco. - ojrac
Realmente puedes cambiarlo en la mayoría de los Unixes. Es un truco asqueroso. Me encanta. :) Lo que hace es conectarse al proceso utilizando el soporte de depuración como ptrace, luego obligue al proceso a llamar a dup2 () para volver a conectar 0,1,2 a otro identificador de archivo. - Zan Lynx
Sí, puedes cambiarlo. Involucra la pausa del proceso (SIGSTOP) y la modificación de los descriptores de archivos para fd 0, 1, 2. Luego reinicia (SIGCONT). - Michael Martinez


Criopido es un desarrollo adicional del autor de grab.c que congela un proceso en un archivo, que luego ejecuta (dentro de la pantalla) para reanudar el proceso.


12
2018-06-14 18:26



¡Bonito! Traté de usar cryopid en la disertación de mi maestro sobre la migración de procesos, pero no funcionó todo el tiempo, sin importar lo que hice. Al final, tuve que usar dynckpt con una versión antigua de Linux. ¿Está usted quizás involucrado en el desarrollo de cryopid? Veo que tu nombre es similar al dominio del autor. - Juliano
No estoy involucrado en el desarrollo, solo conozco al autor de la universidad. No tiene tiempo para mantener el criópido en este momento, por lo que parece que algunas personas comenzaron a trabajar en ello en sharesource.org/project/cryopid - TRS-80


Solo puedo darte un simple "No" sin el por qué de la parte de la pantalla, yo también me interesaría la razón.

Sin embargo has intentado disown (un basin builtin)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

11
2018-06-11 23:02





nohup en Solaris / OpenSolaris tiene un indicador -p para nohup en un proceso en ejecución; por ejemplo, vea el Página de manual de Solaris 10 nohup.


9
2018-06-13 00:59





Hace poco vi un enlace a neercs, que es una utilidad similar a una pantalla creada con libcaca, una biblioteca en color ascii-art. Entre otras características, cuenta con la capacidad de capturar un proceso existente y volver a ser padre dentro de su sesión de neercs (pantalla).

Sin embargo, no lo he usado, así que no puedo comentar si funciona o no.


5
2018-06-14 21:03





Probablemente estoy pensando mal en esto, así que siéntete libre de corregirme (¡ya aprendí sobre el desautorizado!) ... ¿Un ctrl-Z y "bg" no funcionarán al menos para que el proceso se ejecute en segundo plano? ¿O es el problema clave que aún desearía ver STDOUT mientras se ejecuta?


2
2018-06-11 23:08



Eso todavía mataría el proceso cuando el tty propietario muera, por lo que el OP debe dejar la casilla donde inició el comando, que es lo que quiere evitar. - serverhorror
Ok voy a comprar eso Gracias por la explicación. Así que las sugerencias de rechazo -h parecen mucho más inteligentes que las mías :-) - Chris_K
Aún podrías hacer esto, justo después de que tuvieras que rechazar -h: stackoverflow.com/a/625436/705198 - AndrewPK


Si puede vivir sin poder interactuar con el proceso y no se opone a cargar módulos de kernel aleatorios, podría hacerlo peor que mirar Fisgonear. Alternativamente, hay un par de otros proyectos. aquí es una llamada a injcode, que en su mayoría puede hacer lo que quieras hacer.


2
2018-06-11 23:35