Comment récupérer un processus refusé?

12

Semblable à de nombreuses questions précédentes, je me suis retrouvé à exécuter un travail que j'aurais aimé exécuter à l'écran. J'ai été obligé de renier le processus parce que je devais me déconnecter. Maintenant que je me suis reconnecté, je constate que le processus est toujours en cours d'exécution. Comment puis-je "récupérer" le processus, afin que je puisse voir sa sortie et lui donner une entrée?

Cette question est distincte du simple déplacement d'un processus en cours d'exécution vers l'écran, en ce qu'elle implique la réouverture des poignées stdin / out / err perdues.

Sparr
la source
2
Copie

Réponses:

6

C'est une question en double - voir Déplacer un processus déjà en cours d'exécution vers Screen , qui pointe vers retty , qui est un horrible hack auto-décrit implémentant ce que j'avais toujours pensé être possible mais jamais vraiment essayé: il trouve fd 0, 1 et 2 (standard in, out et error, respectivement) pour le processus et s'y attache, comme un horrible parasite aberrant qui ne devrait pas l'être.

mattdm
la source
Je ne connaissais pas ce programme - bien que la vérité soit dite, ce n'est pas une bonne pratique de l'utiliser! Bonne réponse, peu importe.
Andrew M.
6

En reniant le processus, vous dites en fait que vous voulez qu'il ignore les SIGHUP émis par le terminal. Une fois que vous fermez votre session (disons, bash), ce processus deviendra alors la propriété d'init. Donc, lorsque vous dites que vous souhaitez reprendre possession d'un processus après avoir renoncé à la propriété, vous dites que vous souhaitez retirer la propriété d'un autre processus - qui n'est pas implémenté, et pour une bonne raison. Ce n'est tout simplement pas possible de le faire gracieusement sous Linux.

Andrew M.
la source
1
Les processus ne possèdent pas d'autres processus similaires. Un processus désavoué continue de fonctionner comme vous.
mattdm
Ils le font une fois la session parentale close - comme l'indique sa question. J'ai mis à jour ma réponse pour refléter cela.
Andrew M.
Le processus parent passe à init, mais c'est différent de la propriété. L'EUID et l'UID du processus restent ceux de l'utilisateur d'origine. Sinon, cela pourrait être potentiellement exploitable, car chaque utilisateur aurait soudainement un moyen d'exécuter du code en tant qu'un autre utilisateur, et un utilisateur du système non moins.
mattdm
1
EUID / UID! = PPID. Je parle de la propriété du processus, pas des autorisations.
Andrew M.
Oui, je pense que nous sommes d'accord sur tout sauf pour le sens du terme "propriété du processus". Il s'agit de l'ID utilisateur auquel le processus est associé, et non de son processus parent. Peut-être que la confusion est due à la disowncommande spécifique à bash, qui, malgré son nom, n'a en fait rien à voir avec la modification de la propriété du processus.
mattdm