Comment attacher le terminal au process détaché?

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

$ process & 

Ce terminal est maintenant fermé depuis longtime, mais le process est toujours en cours d'exécution et je veux envoyer des commands au stdin de ce process. Est-ce possible?

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

Puis fermez stdin: call close (0) ; et l'ouvrir à nouveau: call open ("/tmp/fifo", 0600)

Enfin, écrivez (à partir d'un terminal différent, car gdb va probablement se bloquer):

echo blah > /tmp/fifo

Je suis certain que vous ne pouvez pas.

Vérifiez en utilisant ps x . Si un process a un ? comme contrôler tty , vous ne pouvez plus y envoyer d'input.

 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 des données à 9947 faisant quelque chose comme echo "test" > /dev/pts/1 . L'autre process ( 9942 ) n'est pas accessible.

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

Je cherchais moi-même un moyen de connecter un process existant à mon terminal actuel pour la même raison (le terminal d'origine n'était plus accessible).

repty 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 "re-ptying" des programmes.

reptyr est un utilitaire pour prendre un programme en cours d'exécution et l'attacher à un nouveau terminal. A commencé un process de longue durée sur ssh, mais doit partir et ne veux pas l'interrompre? Il suffit de lancer un écran, d'utiliser reptyr pour l'attraper, puis de tuer la session ssh et de rentrer chez soi.

USAGE

reptyr PID

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

Après la connection, le process prendra en input et écrira la sortie vers le nouveau terminal, y compris ^ C et ^ Z. (Malheureusement, si vous l'avez en arrière-plan, vous devrez toujours exécuter "bg" ou "fg" dans l'ancien terminal, ce qui est probablement impossible à corriger de façon raisonnable sans devoir patcher votre shell).

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

Vous pouvez essayer d'écrire dans ce process 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 process a toujours un descripteur de file stdin valide. Vous pouvez le vérifier avec ls -l sur / 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 process en cours d'exécution.

Il suffit de terminer la command line avec & ne détachera pas complètement le process, il ne fera que l'exécuter en arrière-plan. (Avec zsh vous pouvez utiliser &! Pour réellement le détacher, sinon vous l'avez disown plus tard).

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

Sinon, il n'est pas possible de modifier ses scriptescriptors (y compris stdin) ou de rattacher un terminal de contrôle perdu … sauf si vous utilisez des outils de debugging (voir la réponse d'Ansgar ou regarder la command retty ).