Je cherche à accéder à un terminal ouvert , c'est-à-dire ouvert localement sur ma machine, à partir d'un ordinateur distant sans utiliser tmux
ou screen
. Il y a plusieurs raisons à cela, la plus simple étant que je n'arrive pas à faire face à une situation où je ne planifiais pas à l'avance, que je courais quelque chose de gros sur mon ordinateur au travail, que je rentrais chez moi et que je voulais ensuite le vérifier via ssh.
En substance, je cherche un moyen d’attacher au terminal qui fonctionne déjà sur un ordinateur et d’afficher sa sortie.
Maintenant, je sais qu'il y a quelques threads qui disent que vous ne pouvez pas faire cela (comme celui-ci ), et d'autres qui recommandent simplement screen
et tmux
(comme celui-ci , celui-ci ou celui-ci ). Ce que je recherche, c’est un moyen d’accéder directement à un processus de terminal en cours d’exécution, ou tout au moins de voir la sortie mise en cache de ce terminal. Je n'ai pas nécessairement besoin de pouvoir entrer des commandes dans ce terminal.
Y a-t-il un moyen de faire cela? Sinon, des idées sur un hack qui pourraient fonctionner? Je pensais que je pourrais probablement trouver un moyen de consigner automatiquement stdout, stderr et les commandes dans un fichier (peut-être un astucieux Tweak sur l'historique bash qui enregistre tout?)
En raison de la construction des terminaux, il n’est pas possible d’accéder à tout , c’est-à-dire qu’il est impossible d’afficher un terminal en fonctionnement et interagissez avec celui-ci si vous ne disposez pas d'une session détachable dans ledit terminal, telle que la session screen
ou tmux
, ou si vous n'avez pas encore démarré. cette commande avec la journalisation via la commande script
.
Ce qui peut être fait est partiellement voir TTY via la commande Sudo cat /dev/vcs1
. /dev/vcs[1-6]
correspondent à leurs consoles TTY respectives. Ceci est limité par la taille de la mémoire tampon de défilement du téléscripteur respectif, ce qui signifie que vous ne pouvez voir que ce qui est gardé en mémoire jusqu'à un certain nombre de lignes. Ceci peut bien sûr être ajusté pour augmenter le nombre de lignes comme indiqué dans réponse de muru ici . Sinon, vous devriez probablement essayer
setterm -file log.txt -dump [ttynumbers]
qui a été mentionné dans cette question ssh .
En fin de journée, bodhi.zazen a correctement noté dans son commentaire , que votre refus d'utiliser screen
ou tmux
est le principal problème. Je comprends tout à fait. J'oublie souvent de suivre moi-même les programmes de longue durée, mais avec certaines commandes, vous devriez commencer à penser à l’avenir.
Puisque vous avez tagué ceci gnome-terminal , en fonction de la version, il peut être possible d’afficher une partie du résultat. De cet article de blog , où l'auteur a voulu voir ce que fait le terminal GNOME pour le défilement "illimité":
Je pourrais simplement regarder quels fichiers
gnome-terminal
étaient ouverts, donclsof
à la rescousse. Ensuite, j'ai découvert que c'était sournois, il y avait un certain nombre de fichiers appelés/tmp/vteXYZ1tv
ouverts, mais il les avait déjà supprimés. Ainsi, vous ne pouvez pas les voir lors de la navigation et ils seront supprimés à la fermeture du programme. [...] Ils peuvent être restaurés, à mon avis (il y en a probablement d'autres): faire unls -l /proc/<gnome-terminal pid>/fd
pour voir à quoi ils pointent. Ensuite, vous pouvezcat
ceux-ci pour créer un nouveau fichier. Ce ne sont que des copies textuelles de la sortie du terminal. Pas de compression. Non rien.
Mais dans les versions plus récentes, les fichiers sont supposés être cryptés. De cette réponse :
vte-0.40 (qui apparaîtra probablement dans Ubuntu 15.10 W.W.) compressera et chiffrera ces fichiers. Cela réduira l'espace de stockage requis à environ un tiers ou un quart de sa taille (si votre application génère X quantité de données sous forme de texte brut, quelque part entre X/4, X/3 est une estimation raisonnable de l'espace de stockage requis). et élimine également le problème de la confidentialité/sécurité au cas où quelqu'un obtiendrait un accès brut au disque dur.
Si vous souhaitez uniquement une sortie future, vous pouvez essayer de faire glisser le processus vers n nouveau TTY utilisant reptyr .
Selon le processus en cours d'exécution à l'intérieur du terminal, vous pouvez avoir du succès avec en jetant un coup d'œil dans l'état et les actions effectuées par ce processus plutôt que ce qu'il a affiché dans le terminal.
Quelques exemples, en supposant que vous ayez en quelque sorte déterminé le PID (ID de processus) du processus donné (par exemple, en utilisant pidof
ou ps
):
Si l'outil donné lance les sous-commandes une à une, vérifiez laquelle est en cours d'exécution à l'aide de ps
.
Si l’outil donné change parfois son répertoire de travail, vérifiez-le en /proc/<PID>/cwd
.
Si l'outil donné fonctionne sur plusieurs fichiers à la suite, vérifiez lequel est ouvert sous /proc/<PID>/fd
. Si vous ne pouvez en voir aucune pour le moment, il se peut que votre processus en ait fermé un et soit sur le point d'ouvrir le suivant; vérifiez à nouveau plusieurs fois le contenu de ce répertoire.
Si la commande opère sur un seul fichier énorme en utilisant les appels système standard read
/write
, vous pouvez trouver le numéro de descripteur de fichier sous /proc/<PID>/fd
et vérifier le décalage actuel dans le fichier correspondant sous /proc/<PID>/fdinfo
. Si la commande utilise pread
/pwrite
à la place, reportez-vous à la puce suivante.
Vous pouvez vous connecter au processus en utilisant strace
pour voir ce qu'il fait: strace -p <PID>
. Quittez peu de temps après en utilisant Ctrl+C (il met fin à strace
uniquement, pas à l'application que vous tracez). Examinez les résultats et recherchez des éléments pertinents qui pourraient vous donner une idée. Utilisez par exemple l'option -e trace
pour limiter cette sortie aux opérations sur les fichiers. Vous verrez par exemple les noms de fichiers ouverts par vos applications, ainsi que les décalages où les opérations pread
/pwrite
se produisent.
D'après les commentaires, il existe plusieurs solutions possibles, mais elles doivent toutes être implémentées AVANT de lancer la commande dans le terminal graphique.
Par exemple, voir https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/13564
Ainsi, les utilisateurs appartenant à la même session X ne peuvent pas se reconnecter à des onglets fermés.
Vous pouvez essayer le reptyr comme suggéré par le muru. Il s’agit d’une solution intéressante, mais il est préférable de mieux planifier vos sessions SSH dès le début.
Vous devez développer une meilleure stratégie de travail.
Personnellement, j'utilise screen car je le connais bien et pour les raisons que vous expliquez, j'utilise toujours une session screen sur ssh, c’est-à-dire que je démarre screen et que verver quitte réellement la session screen. J'ai souvent plusieurs sessions d'écran, une pour chaque VM d'un hôte, par exemple.
VNC sur SSH - https://www.cyberciti.biz/tips/tunneling-vnc-connections-over-ssh-howto.html
FreeNX - https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/
https://help.ubuntu.com/community/Xpra
Avec xpra, vous pouvez démarrer puis rattacher le terminal graphique, mais là encore, vous devez exécuter xpra avant de démarrer le terminal.