Démon shell en direct

Idan Arye

Démon shell en direct


TLDR

J’ai besoin d’un logiciel qui exécute un serveur démon et héberge un programme shell interactif en tant que sous-processus. Le logiciel doit également inclure un programme client qui se connecte au serveur démon et fournit un accès PTY au sous-processus hébergé. Je dois également être en mesure d’envoyer des lignes au STDIN du sous-processus hébergé et de lire son STDOUT à partir de scripts (JSON / XML RPC est préférable, mais je peux également travailler avec HTTP standard (par exemple REST?) Ou avec une ligne de commande fournie avec le Logiciel).

Cas d’utilisation

Je travaille sous Linux et j’utilise Vim comme environnement de développement. Le projet utilise Waf comme système de construction (ce qui signifie que le rapport bruit / signal dans la sortie monte en flèche). Le projet a besoin d’une configuration Linux spécifique pour être construit et exécuté – ce qui signifie soit une machine virtuelle sur mon ordinateur local ou un serveur de compilation distant.

Cela signifie que j’ai besoin de SSH, et puisque j’utilise Vim pour écrire et exécuter des projets, c’est une seconde nature.

Tentative n ° 1: SSH avec commande

C’est la solution simple: exécutez ssh avec une commande composée qui cd s dans le dossier du projet et exécute waf pour configurer / construire / nettoyer le projet, ou tout ce qui est nécessaire pour l’exécuter.

Le problème

Waf crée une quantité de bruit ridiculement importante, ce qui rend difficile la lecture des messages d’erreur lorsque la construction échoue. En raison de la mauvaise émulation de terminal de Vim, je ne peux pas copier le résultat dans un tampon Vim (pour l’analyser à ma façon), et je ne peux pas continuer à utiliser Vim jusqu’à ce que je ferme le résultat de la commande shell.

La sortie est également trop longue pour être affichée en même temps à l’écran, donc je dois continuer à faire défiler des tonnes de sortie Waf inutile chaque fois que je crée.

Lire le résultat directement dans un tampon ( r !ssh... ) ou utiliser un plugin shell tiers sera trop lourd pour une utilisation régulière, car je n’ai pas besoin de toutes ces informations lorsque la construction réussit.

Tentative n ° 2: abus de tmux

C’est ce que j’utilise actuellement. J’exécute une session SSH dans une fenêtre tmux et j’utilise des tmux send-keys pour construire et exécuter à partir d’un script. J’utilise une configuration à deux moniteurs où le petit moniteur de l’ordinateur portable montre Konsole avec la session tmux qui exécute ssh , et l’écran externe plus grand montre Vim avec le code. Il est difficile de lire la sortie exacte, mais je peux facilement voir que la construction est en cours d’exécution et remarquer quand elle échoue, et je peux copier la sortie dans un tampon Vim où je peux l’analyser.

Le problème

Le problème principal est que je dois copier la sortie dans un tampon Vim manuellement. La lecture de la sortie de la dernière commande est quelque chose que j’aimerais automatiser et utiliser dans des scripts qui peuvent l’analyser.

Un autre problème est que je ne peux pas me connecter à la session tmux depuis Vim. Ni l’émulateur de terminal intégré ni aucun des plugins d’émulateur de terminal disponibles ne peuvent exécuter une application TUI comme tmux.

Tentative n ° 3: abus du superviseur

Le superviseur me permet d’exécuter et de contrôler d’autres programmes en tant que démons. Il exécute ces programmes comme ses propres sous-processus, il a donc un accès complet à leurs STDIN, STDOUT et STDERR. Il a la commande fg pour ouvrir une session interactive dans ces programmes, et dispose d’un service XML RPC qui me permet d’envoyer des trucs au STDIN de ces programmes et de lire leurs STDOUT et STDERR.

Le superviseur aurait pu être parfait pour moi, mais il y a un problème qui le rend inutilisable pour mon cas:

Le problème

Supervisor n’a jamais été conçu pour exécuter des programmes shell interactifs – il ne prend pas du tout en charge PTY! Lorsque j’essaie d’exécuter Bash, je peux exécuter des commandes mais je ne reçois pas d’invite (ce qui signifie que Bash ne peut pas dire que STDIN est en attente – une fonctionnalité PTY AFAIK). ssh ne fonctionne pas du tout – pas quand je l’invoque directement et pas quand je l’invoque depuis Bash – j’obtiens simplement une erreur Le Pseudo-terminal will not be allocated because stdin is not a terminal. – et puis mes commandes ne font rien et je dois arrêter le processus.

Donc….

Est-ce que quelqu’un connaît un programme qui peut faire ce que je veux? Quelque chose comme Superviseur avec prise en charge PTY – ou un moyen de faire en sorte que Superviseur lui-même prenne en charge PTY – serait formidable.

Lukas Graf

Peut-être que GNU Screen (similaire à tmux ) pourrait vous être utile. Il vous permet d’écrire un journal de fonctionnement d’une fenêtre, que vous pourriez peut-être utiliser pour obtenir la sortie de waf dans un tampon VIM de manière (semi-) automatisée. Ou transférez la sortie d’une session en cours d’exécution mais détachée vers STDOUT en utilisant l’ screen -X hardcopy /some/file . Je ne sais pas si le tampon de défilement est inclus dans cela.

Idan Arye

@LukasGraf Screen a l’air bien – je l’ai essayé et il fonctionne également correctement lorsqu’il est exécuté dans vimshell , ce qui est un gros plus. Veuillez ajouter une réponse pour que je puisse l’accepter.

Lukas Graf

Super, heureux que vous ayez pu le faire fonctionner pour vous, merci pour les commentaires!

Réponses


 Lukas Graf

Peut-être que GNU Screen (similaire à tmux ) pourrait vous être utile.

Il vous permet d’ écrire un journal de fonctionnement d’une fenêtre (soit en appuyant sur CTRL-a suivi de H dans une session jointe, soit en appelant screen avec -L ). Vous pouvez ensuite utiliser ce screenlog.n pour obtenir la sortie waf dans un tampon VIM de manière (semi) automatisée.

Alternativement, vous pouvez sauvegarder la sortie d’une session en cours d’exécution mais détachée sur STDOUT en utilisant screen -X hardcopy /some/file . Je ne sais pas si le tampon de défilement sera inclus dans ce vidage.

Si vous souhaitez consulter la sortie de manière interactive, vous pouvez également faire défiler une session d’écran: Dans une session jointe, accédez au tampon de défilement en entrant en mode copie avec CTRL-A , suivi de [ . Vous pouvez ensuite faire défiler vers le haut / bas en utilisant CTRL-u et CTRL-d . Pour quitter à nouveau le mode copie, appuyez sur ÉCHAP .

 

#en, démon, direct, shell,

 

wiki

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *