284 votes

Puis-je interrompre/écraser un processus déjà lancé ?

Je fais des tests sur des scripts de migration de données à long terme, via SSH. Disons que je commence à exécuter un scripts vers 16h ; maintenant, 18h arrive, et je me maudis de ne pas avoir fait tout cela en screen .

Y a-t-il un moyen de "rétroactivement" nohup un processus, ou dois-je laisser mon ordinateur en ligne toute la nuit ? S'il n'est pas possible de joindre 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 de réponse négative qui n'aborde pas au moins la question du "pourquoi" - désolé ;) )

6 votes

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

223voto

gharper Points 5315

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

désavouer

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

Sans option, chaque jobpec est supprimé du tableau des jobs actifs. Si l'option -h est donnée, la tâche n'est pas supprimé de la table, mais est marqué de façon à ce que SIGHUP ne soit pas envoyé au 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 fournie, le travail en cours est utilisé. Si aucune spécification de travail n'est fournie, l'option -a signifie supprimer ou marquer tous les travaux ; l'option -r sans l'option jobpec restreint l'opération aux travaux en cours.

91voto

Ben Dunlap Points 1101

Utilisez reptyr

Dans le fichier 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 :

23voto

Dot Net Pro UK Points 761

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

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

Il a besoin d'un certain reformatage pour être compilé avec les versions actuelles de Linux/glibc, mais il fonctionne toujours.

18voto

freiheit Points 14144

Lorsqu'un processus démarre, STDIN, STDOUT et STDERR sont connectés à quelque chose . En général, vous ne pouvez pas changer cela une fois que la commande est lancée. Dans le cas que vous décrivez, il s'agit probablement d'un tty associé à la session ssh. nohup ne fait que ...

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

C'est-à-dire qu'il définit STDIN à /dev/null, STDOUT à un fichier et STDERR à STDOUT. Screen fait des choses beaucoup plus sophistiquées, impliquant la mise en place de ttys qui se dirigent vers lui-même.

Je ne connais aucun moyen de nohup ou de screeniser rétroactivement un processus en cours. Si tu accèdes à /proc/$pid/fd et que tu vois à quoi correspondent 0, 1 et 2.

Vous aurez peut-être un peu de chance avec disown, mais pas si le processus essaie de faire quoi que ce soit avec STDIN, STDOUT ou STDERR.

13voto

Gibbons Points 101

Cryopide est un nouveau développement de l'auteur de grab.c qui fige un processus dans un fichier, que vous exécutez ensuite (à l'intérieur de l'écran) pour reprendre le processus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X