Question Est-ce que je peux nohup / screen un processus déjà commencé?


Je fais quelques essais de scripts de migration de données à exécution longue, sur SSH. Disons que je commence à exécuter un script vers 16 heures; maintenant, 18 heures roule, et je me maudis de ne pas le faire tout en screen.

Est-il possible de "rétroactivement" nohup processus ou dois-je laisser mon ordinateur en ligne toute la nuit? S'il n'est pas possible d'attacher screen à/nohup un processus que j'ai déjà commencé, alors pourquoi? Quelque chose à voir avec la façon dont les processus parent / enfant interagissent? (Je n'accepterai pas une réponse "non" qui ne répond pas au moins à la question "pourquoi" - désolé;))


247
2018-06-11 22:53


origine


Je viens de voir un article de blog intéressant sur disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the - ojrac


Réponses:


Si vous utilisez Bash, vous pouvez exécuter disown -h job

renier

disown [-ar] [-h] [jobspec ...]

Sans options, chaque tâche spécifiée est supprimée du tableau des tâches actives.   Si la -h l'option est donnée, le travail   n'est pas retiré de la table, mais est   marqué afin que SIGHUP ne soit pas envoyé à   le travail si le shell reçoit un   SIGHUP. Si jobspec n’est pas présent, et   ni le -a ni -r l'option est   fourni, le travail en cours est utilisé. Si   aucun jobpec n'est fourni, le -a   option signifie supprimer ou marquer tous   emplois; la -r option sans   L'argument de jobspec limite les opérations   à exécuter des emplois.


200
2018-06-11 23:03



Impressionnant; J'espérais que quelque chose comme cela se présenterait. - ojrac
La vie peut être injuste. Gharper et moi publions cela à peu près au même moment :) - serverhorror
Tu es mon héros - Thomas Dignan
désavouer n'est pas spécifique à bash. C'est aussi en zsh, ksh93, ... - Phil P
J'ai trouvé que vous devez utiliser disown %1 si 1 est le nombre de jobs, contrairement à fg ou bg où vous venez d'utiliser bg 1  serverwatch.com/tutorials/article.php/3935306/… - mltsy


Utilisation reptyr

Du README:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Quelques articles de blog de son auteur:


77
2018-05-22 21:27



Je vais m'en tenir aux outils intégrés (c'est-à-dire désavouer), mais ce n'est pas aussi flexible que reptyr. +1 - ojrac


Pour voler un processus d'un tty à votre tty actuel, vous pouvez essayer ce hack:

http://www.ucc.asn.au/~dagobah/things/grab.c

Il a besoin d’un peu de reformatage pour pouvoir compiler les versions actuelles de Linux / glibc, mais fonctionne toujours.


22
2018-06-12 05:38



Exceptionnellement cool. - ojrac


Lorsqu'un processus démarre, STDIN, STDOUT et STDERR sont connectés à quelque chose. Généralement, vous ne pouvez pas changer cela une fois la commande lancée. Dans le cas que vous décrivez, il s'agit probablement d'un terminal associé à la session ssh. nohup à peu près tout simplement ...

command < /dev/null > nohup.out 2>&1

En d’autres termes, définit STDIN sur / dev / null, STDOUT sur un fichier et STDERR sur STDOUT. Screen fait des choses beaucoup plus sophistiquées impliquant la création de ttys qui se dirigent directement vers lui-même.

Je ne connais aucun moyen de supprimer rétroactivement ou de filtrer un processus en cours. Si vous vous connectez à / proc / $ pid / fd et que vous voyez les points 0, 1 et 2.

Vous pouvez avoir de la chance avec désavoué, mais pas si le processus tente de faire quoi que ce soit avec STDIN, STDOUT ou STDERR.


16
2018-06-11 23:04



+1 pour les bons commentaires. st (din | out | err) est l’autre moitié du problème, et j’apprécie le conseil de départ, la prochaine fois que je serai dans cette impasse. - ojrac
Vous pouvez réellement le changer sur la plupart des Unix. C'est un hack dégoûtant. J'aime cela. :) Ce que vous faites est de vous connecter au processus en utilisant le support de débogage comme ptrace, puis de forcer le processus à appeler dup2 () pour reconnecter 0,1,2 à un autre descripteur de fichier. - Zan Lynx
oui, vous pouvez le changer. Implique de suspendre le processus (SIGSTOP) et de modifier les descripteurs de fichier pour fd 0, 1, 2. Ensuite, redémarrage (SIGCONT). - Michael Martinez


Cryopid est un développement ultérieur de l’auteur de grab.c qui gèle un processus dans un fichier que vous exécutez ensuite (à l’écran intérieur) pour reprendre le processus.


12
2018-06-14 18:26



Agréable! J'ai essayé d'utiliser cryopid dans la thèse de mon maître sur la migration de processus, mais cela ne fonctionnait pas tout le temps, quoi que je fasse. Finalement, j'ai dû utiliser dynckpt avec une ancienne version de Linux. Êtes-vous peut-être impliqué dans le développement de cryopid? Je vois que votre nom est similaire au domaine de l'auteur. - Juliano
Je ne suis pas impliqué dans le développement, je connais juste l'auteur de l'université. Il n’a pas le temps de maintenir cryopid pour le moment, alors il semblerait que certaines personnes aient commencé à travailler dessus sharesource.org/project/cryopid - TRS-80


Je ne peux que vous donner un simple "Non" sans le pourquoi pour la partie écran, je serais intéressé par la raison pour moi-même.

Cependant avez-vous essayé disown (une bash intégrée)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

11
2018-06-11 23:02





nohup sur Solaris / OpenSolaris a un indicateur -p pour indiquer à nohup un processus en cours d'exécution - par exemple, reportez-vous à la Page de manuel de Solaris 10 nohup.


9
2018-06-13 00:59





J'ai récemment vu un lien vers neercs, qui est un utilitaire semblable à l’écran, construit à l’aide de libcaca, une bibliothèque couleur ascii-art. Parmi d'autres fonctionnalités, il offre la possibilité de capturer un processus existant et de le re-parent au sein de votre session (écran) suivante.

Je ne l'ai pas utilisé cependant, donc je ne peux pas dire si cela fonctionne ou non.


5
2018-06-14 21:03





Je suis probablement en train de penser cela, alors n'hésitez pas à me corriger (j'ai déjà appris le désaveu!) ... Ctrl-Z et "bg" ne fonctionneraient-ils pas au moins pour que le processus s'exécute en arrière-plan? Ou est-ce que le problème clé pour lequel vous souhaitez toujours voir STDOUT pendant son exécution?


2
2018-06-11 23:08



Cela tuerait quand même le processus lorsque le propriétaire possédant meurt, le PO doit donc quitter la boîte où il a lancé la commande en cours d'exécution, ce qu'il veut éviter - serverhorror
OK je vais acheter ça. Merci pour l'explication. Donc, les suggestions de désaveu -h ont l’air bien plus intelligentes que les miennes :-) - Chris_K
Vous pouvez toujours le faire, juste après avoir désavoué -h: stackoverflow.com/a/625436/705198 - AndrewPK


Si vous ne pouvez pas interagir avec le processus et que vous ne vous opposez pas au chargement de modules de noyau aléatoires, vous pourriez faire pire que de regarder Fouiner. Alternativement, il y a quelques autres projets. Ici est un appel injcode, qui peut principalement faire ce que vous voulez faire.


2
2018-06-11 23:35