Comment attacher un terminal à un processus détaché?


99

J'ai détaché un processus de mon terminal, comme ceci:

$ process &

Ce terminal est maintenant longtemps fermé, mais processest toujours en cours d'exécution et je souhaite envoyer des commandes au stdin de ce processus. Est-ce possible?



1
Rechercher retty, neercs, etc. , et voir aussi serverfault.com/questions/24425 , serverfault.com/questions/115998
Gilles

Réponses:


112

Oui, ça l'est. Tout d' abord, créez un tuyau: mkfifo /tmp/fifo. Utilisez gdb pour attacher au processus: gdb -p PID

Ensuite , fermez stdin: call close (0); et ouvrez-le à nouveau:call open ("/tmp/fifo", 0600)

Enfin, écrivez (depuis un autre terminal, car gdb sera probablement suspendu):

echo blah > /tmp/fifo


6
Très impressionnant!
Samuel Edwin Ward

1
Puis-je faire quelque chose de similaire pour rediriger le processus stdout vers un fichier?
Rustyx

@rustyx: Non testé, mais cela devrait fonctionner: créer un fichier plutôt que d' un tuyau, touch /tmp/thefile. Stdout est 1, donc call close (1); aussi, utiliser les autorisations appropriées pour l' écriture: call open ("/tmp/thefile", 0400). Le echo…n'est, bien sûr, pas nécessaire.
Ansgar Esztermann

C'est bien! J'utilise ceci pour envoyer des réponses "y" ou "n" à certains processus complètement détachés. Le processus détaché a sa sortie standard dans une fenêtre séparée. Quand je fais ce tour cependant, je peux voir qu'il ne "reçoit" pas le 'y' ou le 'n' dès que je le répète, je dois quitter gdb et le détacher, puis il reçoit tous les échos en conséquence, alors Existe-t-il un moyen de réaliser cela sans avoir besoin de quitter gdb avant que le processus ne reçoive l'entrée du fifo?
krb686

malheureusement, cela semble juste accroché call open("/tmp/fifo", 0600). toute aide serait grandement appréciée
archer

27

Lorsque le terminal d'origine n'est plus accessible ...

reptyrpeut être ce que vous voulez, voir https://serverfault.com/a/284795/187998

Citation de là:

Jetez un coup d'œil à reptyr , qui fait exactement cela. La page github contient toutes les informations.

reptyr - Un outil pour "re-ptying" des programmes.

reptyr est un utilitaire permettant de reprendre un programme en cours d’exécution et de le relier à un nouveau terminal. Vous avez démarré un processus de longue haleine sur ssh, mais vous devez partir et vous ne voulez pas l'interrompre? Commencez juste un écran, utilisez reptyr pour le saisir, puis tuez la session SSH et rentrez chez vous.

USAGE

PID reptyr

"reptyr PID" va saisir le processus avec l'identifiant PID et l'attacher à votre terminal actuel.

Après la connexion, le processus prend les entrées et écrit les sorties sur le nouveau terminal, y compris ^ C et ^ Z. (Malheureusement, si vous avez un problème d’arrière-plan, vous devrez toujours exécuter "bg" ou "fg" dans l’ancien terminal. Il est probablement impossible de le réparer de manière raisonnable sans appliquer de correctif à votre shell.)


12

Je suis bien sûr que vous ne pouvez pas.

Vérifier en utilisant ps x. Si un processus a ?comme tty de contrôle , vous ne pouvez pas envoyer des données à ce plus.

9942 ?        S      0:00 tail -F /var/log/messages
9947 pts/1    S      0:00 tail -F /var/log/messages

Dans cet exemple, vous pouvez envoyer une entrée pour 9947faire quelque chose comme echo "test" > /dev/pts/1. L'autre processus ( 9942) n'est pas accessible.

La prochaine fois, vous pourriez utiliser screen ou tmux pour éviter cette situation.


5
Ou dtachsi vous n'avez pas besoin d'un tout screen.
Manatwork

4
Les normes (POSIX, SUS) sont absentes, mais sur de nombreux systèmes (la plupart?), Il est possible d’utiliser les mécanismes utilisés par les débogueurs. Voir la réponse de Ansgar . Avec rootvous, vous pouvez même faire cela aux processus d'autres utilisateurs.
dmckee

3
Faire echo "test" > /dev/pts/1n'enverra pas d'entrée au processus 9947- il produira le mot "test" sur le terminal de ce processus.
psmears

6

EDIT : Comme l'a dit Stéphane Gimenez, ce n'est pas si simple. Cela vous permet uniquement d'imprimer sur un autre terminal.

Vous pouvez essayer d'écrire dans ce processus en utilisant / proc . Il devrait être situé dans / proc / pid / fd / 0 , donc un simple:

echo "hello" > /proc/PID/fd/0

devrait le faire. Je ne l'ai pas essayé, mais cela devrait fonctionner, tant que ce processus a toujours un descripteur de fichier stdin valide . Vous pouvez le vérifier avec ls -lle / proc / pid / fd / .

  • si c'est un lien vers / dev / null => c'est fermé
  • si c'est un lien vers / dev / pts / X ou une socket => c'est ouvert

Voir nohup pour plus de détails sur la façon de garder les processus en marche.


2
Ce n'est pas aussi simple. Par exemple, si stdin est lié à un terminal, echoquelque chose que ce soit sur le terminal imprimera simplement ce que vous avez écrit sur le terminal, il ne sera pas transmis au processus.
Stéphane Gimenez

5

Le fait de terminer la ligne de commande avec &ne détachera pas complètement le processus, il le lancera simplement en arrière-plan. (Avec zshvous pouvez utiliser &!pour réellement détacher, sinon vous devez le faire disownplus tard).

Lorsqu'un processus s'exécute en arrière-plan, il ne reçoit plus d'informations de son terminal de contrôle. Mais vous pouvez le renvoyer au premier plan avec fg, puis il relira l’entrée.

Autrement, il n'est pas possible de modifier en externe ses descripteurs de fichiers (y compris stdin) ni de rattacher un terminal de contrôle perdu… à moins d'utiliser des outils de débogage (voir la réponse d'Ansgar ou jetez un coup d'œil à la rettycommande).


Et il y a une question connexe ici: unix.stackexchange.com/q/17648/9426
Stéphane Gimenez

@Rogach a déclaré "Ce terminal est maintenant longtemps fermé".
andcoz

1
@ andcoz: Oui, mais il a eu de la chance que le programme n'ait pas été SIGHUPed. Je proposais une méthode plus sûre.
Stéphane Gimenez

ici, désavoué ne fonctionne vraiment que si je redirige d'abord stdout comme avec >>/dev/stderr, sinon, lorsque je fermerai le terminal, le processus "désavoué" se terminera aussi .. Je n'ai jamais vraiment compris cela ..
Aquarius Power
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.