Bash / ZSH: annulation de la «renonciation»

30

Existe-t-il un moyen de «rattacher» un processus à la table de travail des coques après qu'il a été «désavoué»?

Edit: $ SEARCHENGINE me manque totalement. Ça n'a pas l'air trop beau.

nisc
la source

Réponses:

16

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!".

lornix
la source
1
Cela ne peut pas être vrai: le processus parental ne peut pas faire adopter l'enfant, sauf en quittant. Le comportement que vous décrivez doit être déclenché à partir du processus enfant (ou par le noyau, qui le fait automatiquement en cas de décès du parent). Un processus ne peut pas adopter un enfant volontairement mais il ne peut pas non plus l'abandonner.
Gilles 'SO- arrête d'être méchant'
1
Mes excuses. Ma faute. Trop simplifié. Parcourez à nouveau la source bash, bash conserve toujours la propriété, mais empêche le soupir d'être transmis au processus enfant. Il pourrait donc être possible de le récupérer, mais ce n'est pas encore intégré à bash. Pour une raison quelconque, je suis resté coincé dans la récolte d'initiés d'orphelins et de zombies par init.
lornix
@lomix oui, mais lorsque vous quittez le shell dont vous l'avez renié, il obtient alors un ppid de 1. donc votre raisonnement est valide. qui renie à moins qu'ils ne soient sur le point de sortir de toute façon: p
Orwellophile
1
Désolé, mais cette réponse est fausse. Utilisez simplement reptyr(voir ma réponse pour un exemple d'utilisation).
Christian Pietsch
18

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).

Thom
la source
2
Eh bien, j'ai récupéré mon processus vim désavoué avec reptyr, donc cela a fonctionné comme l'utilitaire de non-renonciation que je cherchais.
hlovdal
Vous avez raison, @hlovdal: Cette réponse est à moitié fausse. reptyrest 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.
Christian Pietsch
11

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
Christian Pietsch
la source
2
(sudo apt-get install reptyr) Puis obtenu ceci lors de la première tentative: "Le noyau a refusé l'autorisation lors de la connexion. Si votre uid correspond à la cible, vérifiez la valeur de / proc / sys / kernel / yama / ptrace_scope. Pour plus d'informations, consultez /etc/sysctl.d/10-ptrace.conf "J'ai changé la valeur des deux emplacements de 1 à 0 et cela a fonctionné. J'ai testé un désaveu et un reptyr d'un processus comme le même utilisateur (bloc-notes ipython sur ubuntu 14.04 LTS). Peut-être que c'est correct pour le développement dans un environnement isolé ... mais je ne suis pas sûr des ramifications de sécurité ultimes du changement. Peut-être que quelqu'un avec de l'expertise peut sonner.
FizxMike
1

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, jobdirset les jobtexttableaux 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 SIGSTOPet SIGCONTau processus désavoué pour simuler Ctrl+ Zet bg. Rien de tout cela ne sera aussi pratique que de reprendre possession.

Gilles 'SO- arrête d'être méchant'
la source
0

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.

Scott
la source
6
Les circonstances sont les suivantes: vous reniez le mauvais processus et vous souhaitez le récupérer.
2010
1
Ah. Plus fort. L'écran doit être planifié à l'avance.
Scott