Réponses:
Compte tenu du fonctionnement des travaux Linux et de la propriété des processus, je crains qu'il ne soit pas vraiment possible de devenir propriétaire d'un processus sans l'aide du processus d'adoption.
Un parent peut «renier» un enfant, qui est ensuite «adopté» par le processus nommé «init». La sécurité du système empêche quelqu'un de saisir les processus de quelqu'un d'autre. Lorsque vous le reniez, un processus devient le contrôle de quelqu'un d'autre (init). En tant qu'utilisateur, vous pouvez toujours tuer le processus, mais vous ne pouvez pas le récupérer. Il est peu probable que tenter de contraindre init à renvoyer votre processus fonctionne, car init ne lit même pas le courrier.
Aussi méchant que cela puisse paraître, cela se résume vraiment à la réponse "Ne fais pas ça!".
reptyr
(voir ma réponse pour un exemple d'utilisation).
Bien que je suppose que cela n'aide personne dans la situation malheureuse d'avoir renié le mauvais processus, si vous deviez bannir le reniement de votre flux de travail et le remplacer par:
https://github.com/nelhage/reptyr
Vous seriez en mesure de réparer n'importe quel processus (c'est-à-dire de le déplacer à l'intérieur de l'écran).
reptyr
est la solution, mais il n'est pas nécessaire d'arrêter d'utiliser disown
. Pour plus de clarté, j'ai écrit une nouvelle réponse.
Tout ce dont vous avez besoin est reptyr
. Il vit sur GitHub et a été empaqueté pour Debian depuis Wheezy, et probablement aussi pour d'autres distributions GNU / Linux. Il mettra en avant votre processus désavoué dans le terminal actuel si vous l'invoquez avec son ID de processus (PID). Ainsi, par exemple:
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
Non désolé. En principe, cela serait possible, car le désaveu modifie simplement un état interne du shell - il supprime fondamentalement l'ID de processus d'une liste, et il pourrait être remis sans trop de tracas (vous devriez être un peu prudent en testant que le pid réattaché est dans la bonne session, mais ce n'est pas insurmontable). Mais aucun des shells habituels (bash, ksh, tcsh, zsh) ne semble avoir un moyen de rajouter. (Même si avec zsh , vous pouvez écrire au jobstates
, jobdirs
et les jobtext
tableaux associatifs, je ne sais pas combien vous pouvez obtenir de cette façon.)
Si vous voulez que le shell envoie des signaux au processus refusé comme il le fait pour ses sous-processus possédés, vous pouvez écrire un travail de remplacement qui attend jusqu'à ce qu'il reçoive un signal et envoie le même signal au processus refusé. Vous pouvez envoyer SIGSTOP
et SIGCONT
au processus désavoué pour simuler Ctrl+ Zet bg
. Rien de tout cela ne sera aussi pratique que de reprendre possession.
Quelles sont les circonstances? Si vous souhaitez simplement récupérer votre terminal pendant un certain temps, vous pouvez utiliser GNU Screen à la place. Il ne détache pas tout à fait le processus d'un terminal - Screen en émule un pour le bénéfice du processus - mais vous pouvez l'attacher et le détacher du vrai terminal que vous utilisez. Vous pouvez même détacher un écran, vous déconnecter, puis vous reconnecter et vous reconnecter au même écran.