Bash / ZSH: Deshaciendo 'renegar'

30

¿Hay alguna manera de "volver a conectar" un proceso a la tabla de trabajo de shells después de que se haya "rechazado"?

Editar: $ SEARCHENGINE totalmente me falla. No se ve muy bien.

nisc
fuente

Respuestas:

16

Teniendo en cuenta cómo funcionan los trabajos de Linux y la propiedad del proceso, me temo que no es realmente posible volver a ser propietario de un proceso, sin la ayuda del proceso de adopción.

Un padre puede 'repudiar' a un hijo, que luego es 'adoptado' por el proceso llamado 'init'. La seguridad del sistema evita que alguien tome los procesos de otra persona. Cuando lo desconoces, un proceso se convierte en el control de otra persona (init). Usted, como 'usuario', aún podría matar el proceso, pero no puede recuperarlo. Es poco probable que intente obligar a init a devolver su proceso, ya que init ni siquiera lee el correo.

Tan malo como suena, realmente se reduce a la respuesta de "¡No hagas eso!".

lornix
fuente
1
Esto no puede ser correcto: el proceso padre no puede hacer que se adopte al hijo excepto al salir. El comportamiento que describe tiene que desencadenarse desde el proceso secundario (o por el núcleo, que hace algo de esto automáticamente si el padre muere). Un proceso no puede adoptar a un niño voluntariamente, pero tampoco puede renunciar a uno.
Gilles 'SO- deja de ser malvado'
1
Mis disculpas. Mi culpa. Sobre simplificado demasiado. Corrió a través de la fuente de bash nuevamente, bash aún conserva la propiedad, pero inhibe que el suspiro se transmita al proceso secundario. Por lo tanto, podría ser posible recuperarlo, pero no está integrado en bash (todavía). Por alguna razón me quedé atrapado en la cosecha inicial de huérfanos y zombis.
lornix
@lomix, sí, pero cuando abandonas el shell desde el que lo rechazaste, entonces obtiene un ppid de 1. por lo que tu razonamiento es válido. quien rechaza a menos que estén a punto de salir de todos modos: p
Orwellophile
1
Lo siento, pero esta respuesta es incorrecta. Solo use reptyr(vea mi respuesta para un ejemplo de uso).
Christian Pietsch
18

Si bien supongo que esto no ayuda a nadie en la desafortunada situación de haber repudiado el proceso incorrecto, si fuera a desterrar su flujo de trabajo y reemplazarlo con:

https://github.com/nelhage/reptyr

Sería capaz de reparar cualquier proceso (es decir, moverlo dentro de la pantalla).

Thom
fuente
2
Bueno, recuperé mi proceso vim desautorizado con reptyr, por lo que funcionó igual que la utilidad no conocida que estaba buscando.
hlovdal
Tienes razón, @hlovdal: esta respuesta es medio errónea. reptyres la solución, pero no hay necesidad de dejar de usar disown. Para mayor claridad, he escrito una nueva respuesta.
Christian Pietsch
11

Todo lo que necesita es reptyr. Vive en GitHub y se ha empaquetado para Debian desde Wheezy, y probablemente también para otras distribuciones de GNU / Linux. Pondrá en primer plano su proceso denegado en el terminal actual si lo invoca con su ID de proceso (PID). Así por ejemplo:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here
Christian Pietsch
fuente
2
(sudo apt-get install reptyr) Luego obtuvo esto en el primer intento: "El kernel denegó el permiso durante la conexión. Si su uid coincide con el objetivo, verifique el valor de / proc / sys / kernel / yama / ptrace_scope. Para obtener más información, consulte /etc/sysctl.d/10-ptrace.conf "Cambié el valor en ambas ubicaciones de 1 a 0 y funcionó. Probé un repudio y reptyr de un proceso como el mismo usuario (cuaderno de ipython en ubuntu 14.04 LTS). Quizás esto esté bien para el desarrollo en un entorno aislado ... sin embargo, no estoy seguro de las ramificaciones de seguridad finales del cambio. Tal vez alguien con experiencia pueda
intervenir
1

Lo siento, no. En principio, sería posible, ya que el rechazo simplemente cambia algún estado interno del shell: básicamente elimina la identificación del proceso de una lista, y podría volver a colocarse sin demasiados problemas (tendría que ser un poco cuidadoso al probar que el pid conectado nuevamente está en la sesión correcta, pero eso no es insuperable). Pero ninguno de los shells habituales (bash, ksh, tcsh, zsh) parece tener una forma de volver a agregar. (Aunque con zsh se puede escribir en el jobstates, jobdirsy jobtextmatrices asociativas; no sé cuánto se puede lograr de esa manera.)

Si desea que el shell envíe señales al proceso desautorizado como lo hace para sus subprocesos propios, puede escribir un trabajo auxiliar que espere hasta que reciba una señal y envíe la misma señal al proceso desautorizado. Puede enviar SIGSTOPy SIGCONTal proceso denegado para simular Ctrl+ Zy bg. Nada de esto será tan conveniente como volver a ser propietario.

Gilles 'SO- deja de ser malvado'
fuente
0

Cuales son las circunstancias? Si solo desea recuperar su terminal por un tiempo, puede usar GNU Screen en su lugar. No bastante separar el proceso desde un terminal - emula una pantalla para el beneficio del proceso - pero se puede conectar y desconectar desde el terminal real que está utilizando. Incluso puede separar una pantalla, cerrar sesión, volver a iniciar sesión y volver a adjuntarla a la misma pantalla.

Scott
fuente
66
Las circunstancias son: Usted desconoce el proceso incorrecto y desea recuperarlo.
nisc
1
Ah Más fuerte. La pantalla debe ser planificada de antemano.
Scott