Nohup remoto después del hecho con tcsh

11

Tengo una instancia de tcsh en un xterm que ejecuta un proceso a largo plazo (¿semanas?). El servidor Xvnc en el que se está ejecutando salió en la maleza; consume 100% de CPU y no responde. (Este es un error conocido y que es irrecuperable).

El proceso a largo plazo se está bloqueando actualmente en stdout.

¿Hay alguna manera de eliminar un proceso subyacente (tcsh, xterm, lo que sea) y mantener ese proceso a largo plazo?

(Por favor, no hay respuestas sobre screen. Lo sé. No es mi proceso; es un usuario. No aprenderán).

wfaulk
fuente

Respuestas:

17

Esta publicación puede ayudar. La recomendación es:

  1. Fondo del proceso (con Ctrl-Z, luego bg )
  2. ejecute disown -h% [jobid] (probablemente un bash-ism, por lo que tendrá que traducir para tcsh)

La mala noticia , por supuesto, es que el bg tendría que hacerse en el mismo shell en el que se ejecuta el proceso ... pero ... ya podría estar en segundo plano.

La muy mala noticia es que la llamada desconocida podría tener que hacerse en el mismo shell. En cuyo caso, sí, estás jodido. Pero no estoy seguro, tal vez la raíz pueda desconectarlo por la fuerza.

Hmm Posibles buenas noticias : tcsh hace el rechazo automáticamente:

Si tcsh sale anormalmente, rechaza automáticamente los trabajos que se ejecutan en segundo plano cuando sale.

Entonces, si su proceso a largo plazo ya está en segundo plano, matar a su padre tcsh debería permitir que continúe. El proceso ahora está desconectado de la terminal de inicio. (Si no, vea "malas noticias" arriba).

Desafortunadamente, no es pantalla, por lo que no hay una reconexión real. Puede simularlo con gdb quizás (nuevamente, desde el primer enlace):

[...] con algunos trucos sucios, no es imposible volver a abrir un proceso 'stdout / stderr / stdin.

Por lo tanto, aún podría crear una ventana de pantalla en blanco (por ejemplo, que ejecuta suspensión).

Y luego use gdb, por ejemplo, para adjuntarlo al proceso, haga una llamada close (0)
call close (1)
call close (2)
call open ("/ dev / pts / xx", ...)
call dup (0)
llamar a dup (0)
separar

La salida del proceso iría a la pantalla. No estaría conectado a ese terminal de pantalla, por lo que, por ejemplo, [sic] mataría el comando "dormir", no el proceso, pero eso podría ser suficiente para el OP.

Me pregunto si no debería haber "call dup (1)" y "call dup (2)" en ese proceso también ...

quijote curandero
fuente
Sí, es un proceso en primer plano, así que supongo que estoy jodido.
wfaulk 02 de
Si. pero como dijiste, no es tu proceso, no es tu culpa. lamento que te quedes atrapado con el desastre, aunque.
quack quijote
2
Esto me salvó totalmente el culo. Encontré el mismo problema que publiqué inicialmente, que era que el proceso se bloqueaba en STDOUT cuando el servidor X (y, supongo, el xterm en el medio) se bloqueó. Resulta que realmente no necesitaba hacer nada excepto cerrar STDOUT. Esa salida fue irrelevante; los datos reales están en un archivo de registro en alguna parte. Así que pude adjuntar con gdb, ejecutar "call close (1)" y luego "cont" y se está moviendo nuevamente. ¡Muchas gracias!
wfaulk
eh! interesante. que descongelo todo? rareza. Me alegro de que haya ayudado.
quack quijote
2
Puede valer la pena señalar que enviar "Ctrl-Z" a un proceso en primer plano y enviar SIGSTOP a su pid es lo mismo. (SIGCONT inicia el proceso nuevamente.) No sé si esto sería útil para otros en la misma situación o no, pero, en mis pruebas rápidas, enviar SIGSTOP seguido de SIGCONT duplica "Ctrl-Z" seguido de bg.
wfaulk