web-dev-qa-db-fra.com

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

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

$ process &

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

107
Rogach

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

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

Enfin, écrivez (à partir d'un autre terminal, car gdb se bloquera probablement):

echo blah > /tmp/fifo

117
Ansgar Esztermann

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

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

Citation de là:

Jetez un oeil à reptyr , qui fait exactement cela. La page github contient toutes les informations.

reptyr - Un outil pour "repeupler" les programmes.

reptyr est un utilitaire pour prendre un programme en cours d'exécution et l'attacher à un nouveau terminal. Vous avez démarré un processus de longue durée sur ssh, mais vous devez partir et vous ne voulez pas l'interrompre? Il suffit de démarrer un écran, d'utiliser reptyr pour le saisir, puis de tuer la session ssh et de rentrer à la maison.

USAGE

reptyr PID

"reptyr PID" saisira le processus avec l'ID PID et le rattachera à votre terminal actuel.

Après l'attachement, le processus prendra l'entrée et l'écriture de la sortie vers le nouveau terminal, y compris ^ C et ^ Z. (Malheureusement, si vous le faites en arrière-plan, vous devrez toujours exécuter "bg" ou "fg" dans l'ancien terminal. Ceci est probablement impossible à résoudre de manière raisonnable sans patcher votre Shell.)

34
NiKiZe

Je suis sûr que vous ne pouvez pas.

Vérifiez à l'aide de ps x. Si un processus a un ? comme contrôlant tty , vous ne pouvez plus lui envoyer d'entrée.

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 à 9947 faire quelque chose comme echo "test" > /dev/pts/1. L'autre processus (9942) n'est pas accessible.

La prochaine fois, vous pouvez utiliser écran ou tmux pour éviter cette situation.

12
andcoz

[~ # ~] modifier [~ # ~] : 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 -l on /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 maintenir les processus en cours d'exécution.

6
Coren

Fin de la ligne de commande avec & ne détachera pas complètement le processus, il l'exécutera simplement en arrière-plan. (Avec zsh, vous pouvez utiliser &! pour le détacher, sinon vous devez le faire disown plus tard).

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

Sinon, il n'est pas possible de modifier en externe ses descripteurs de fichiers (y compris stdin) ou de rattacher un terminal de contrôle perdu ... sauf si vous utilisez des outils de débogage (voir réponse d'Ansgar , ou consultez le retty).

5
Stéphane Gimenez