Journal diss, gestionnaire de session terminal en rust

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
25
27
oct.
2022

Cher journal, c'est derniers temps j'ai travaillé sur un petit projet en rust, diss.

Site du projet (github)

Diss est un programme (ainsi qu'une crate rust) qui permet de détacher une session d'un terminal, comme dtach et abduco
(un peu comme screen ou tmux mais sans le multiplexing de terminal).

L'idée, tout comme abduco, est d'avoir un programme simple pour détacher d'autres programmes,
et de les combiner avec d'autres outils pour faire du multiplexing.
Ici on est en rust donc plus safe d'un point de vue mémoire que le C d'abduco
(3 unsafe utilisés que j'espère enlever petit à petit).

utilisation

en terme d'interface, diss est très proche d'abduco:

Pour lancer une nouvelle session (par exemple la commande vim hello ici):

$ diss -e g -a session-name vim hello
  • -e g indique que pour détache la session il faut faire CTRL+G
  • -a session-name indique le nom de session

on peut connecter plusieurs terminaux à la même session en faisant

$ diss -e g -a session-name

On peut aussi tout à fait utiliser diss comme une crate (lib)

let command = vec![
    "nvim".to_string(),
    "hello".to_string(),
];
diss::run("session-name".to_string(), &command, env_vars, Some("g".into()))?;

Fonctionnement

diagramme

Lorsque l'on démarre une nouvelle session, diss fork et lance un server, qui va:

  1. créer et écouter une socket unix (dans ~/.config/diss/<session-name>)
  2. daemonizer le server (e.g. changer le parent du process pour que ne soit plus le terminal mais à la place init)
  3. forker:
  4. le process enfant lance le programme que l'on veut utiliser
  5. le parent lance un thread pour écouter la sortie de l'enfant

Ensuite, diss lance le client qui se:

  1. connecte au server via la socket unix
  2. envoie la taille du terminal
  3. envoie une demande de flush du terminal
  4. lance un thread ou il capture les événements (touche, redimensionnement, clear) et les envoie aux server
  5. reçoit les octets du server et les affiche

Quand un client se connecte, le server:

  1. ajoute le stream unix au thread d'écoute des événements du process forké
  2. crée un nouveau thread pour transférer les événements du client au process forké.

futur

J'utilise cette crate au quotidien, ce qui me permet de réparer les bugs petit à petit.
Je suis en train de l'intégrer à mon plugin vim (vmux), (c'est d'ailleurs pour ce projet que j'ai créé diss), mais c'est une histoire pour un autre journal.

  • # joli projet

    Posté par  (site web personnel) . Évalué à 10. Dernière modification le 28 octobre 2022 à 08:30.

    tu cites screen et tmux, il y a aussi zellij en Rust

    https://github.com/zellij-org/zellij

    ウィズコロナ

  • # nohup

    Posté par  . Évalué à 4.

    Je n'ai jamais vraiment utilisé ce genre de logiciel. Quand je veux qu'un processus soit persistant à ma déconnexion j'utilise nohup.

    nohup me permet au passage de garder la sortie standard du processus et c'est important pour moi.

    De ce que je comprends de ton schéma, il n'y a rien pour ça dans diss ? À moins qu'une socket unix ai un buffer illimité on ne retrouve que les dernières lignes de la sortie standard ?

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

    • [^] # Re: nohup

      Posté par  (site web personnel, Mastodon) . Évalué à 4.

      nohup garde la sortie standard si c'est un terminal ; sinon la commande redirige vers nohup.out
      Les utilitaires pour détacher une session sont arrivés après NoHUp dont le but initial est d'ignorer le signal SigHUp mais pas les autres. Ces utilitaires permettent d'avoir : autant de sessions non-interactives que l'on veut, de les nommer (plus facile pour s'y retrouver), de les partager selon ses besoins/désirs (comparativement, toutes les commandes lancées avec nohup vont utiliser le même nohup.out qui va rapidement être confus du coup), et les rattacher quand on veut.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: nohup

        Posté par  . Évalué à 2.

        Je sais très bien tout ça.

        Ma question c'est est-ce que diss a un mécanisme pour garder la sortie des processus qu'il gère ?

        https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

        • [^] # Re: nohup

          Posté par  (site web personnel) . Évalué à 2. Dernière modification le 30 octobre 2022 à 11:32.

          Je ne peux pas répondre à la place de Yazgoo pour diss, mais tu peux toi faire une redirection de stdout et stderr vers des fichiers selon tes besoins.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.