Tmux praktikoje: vietiniai ir įdėti nuotoliniai tmux seansai

Aptariame „tmux“ funkcijas, jų tinkamumą vietiniams ir nuotoliniams scenarijams bei tai, kaip nustatyti ir konfigūruoti „tmux“, kad jie palaikytų įdėtus seansus

Tai yra pirmoji mano „tmux“ dalis praktinių straipsnių serijose. Tai yra apie „tmux v2“ naudojimą ir konfigūravimą, vietinių ir nuotolinių „tmux“ seansų naudojimą ir tai, kaip palaikyti scenarijų, kai nuotolinė „tmux“ sesija bus įdėta į vietinę „tmux“ sesiją.

Prieš pradedant skaityti, pateikiame veikiantį mano mašinos pavyzdį. Mes turime vietinę „tmux“ sesiją OSX viduje „iTerm2“ (vykdoma viso ekrano režimu). Vietinėje sesijoje yra 2 langai: „zsh“ ir „mazgas“.

„Zsh“ langas yra padalintas į 2 langus: abiejuose languose mes SSH nukreipėme į nuotolinius kompiuterius („CentOS7“ ir „Ubuntu14“) ir ten peršokome į nuotolines „tmux“ sesijas.

Apatinė sritis su nuotoliniu „Ubuntu14“ seansu toliau padalijama į 2 sritis ir turime 3 langus: apvalkalą, pirmadienį ir žurnalus.

Jei smalsu, kaip visa tai veikia kartu, skaitykite toliau.

funkcijos

Pirmiausia greitai apžvelkime „tmux“ funkcijas ir pranašumus, kad suprastume jų svarbą vietiniams ar nuotoliniams scenarijams. Turėtume išsiaiškinti, kodėl mums reikalingas šis „įdėtas tmux in tmux“ dalykas, nes iš pirmo žvilgsnio jis atrodo gana beprotiškas.

  1. Terminalo tankinimas, pavadintas langais, padalija langą į keletą langų. Tai yra prasmingiau vietinei aplinkai, kai nusprendžiate papildyti terminalo emuliatorių, kuris kitaip nepalaiko minėtų funkcijų. Pavyzdžiui, „iTerm“ arba „Terminator“ jau gali multipleksuoti terminalą.
  2. Nustatykite ir pradėkite „tmux“ sesiją naudodami iš anksto sukonfigūruotą langų ir stiklų rinkinį, jų išdėstymą ir komandas, kad išvengtumėte vargo pakartotinai juos nustatyti iš naujo. Pavyzdžiui:

    - „dev“ seansas, kuriame yra langas „# 1: apvalkalas“ su 2 langeliais, skirtas naudoti ad-hoc

    - "# 2: stebėti" langas su htopir sysdigstiklai

    - „# 3: log“ langas journalctlir tail -f app.loglangai

    - „# 4: mazgas“ langas, kuriame veikia nodeserveris

    „tmux“ leidžia jums rašyti scenarijų, kad tai pasiektumėte, o jei jums labiau patinka į konfigūraciją panašus metodas, pažvelkite į „tmuxinator“. Tai aktualu tiek vietiniam, tiek nuotoliniam scenarijui.

  3. Išlaikykite savo darbinę būseną, kad vėliau galėtumėte atsiskirti ir tęsti tą pačią būseną, kurią palikote. Dirbdami vietoje su keliais projektais, galite nustatyti kelis kiekvieno projekto „tmux“ seansus ir lengvai perjungti kontekstą

    Nuotoliniame kompiuteryje galite atsijungti nuo sesijos iki darbo dienos pabaigos ir vakare grįžti į tą pačią sesiją iš namų.

  4. Išgyventi staigų ryšį. Tai yra viena iš svarbiausių savybių. Tarkime, jūs SSH esate nuotoliniame pagrindiniame kompiuteryje ir ten turite ilgai trunkantį procesą. Jei SSH ryšys nutrūktų arba įvyktų fizinis tinklo nutrūkimas, SIGHUP signalas būtų siunčiamas į nuotolinį apvalkalą ir jis bei visi jo antriniai procesai būtų nutraukti. „Tmux“ paverčia jūsų nuotolinius procesus atspariais tokiai rizikai.

Mažiau svarbios savybės, tačiau vis tiek verta paminėti, yra šios:

  1. Kai sukursite „tmux“ aplinką, mažiau priklausysite nuo pagrindinio terminalo emuliatoriaus ir jo unikalių funkcijų rinkinio , todėl galėsite persijungti į kitą terminalo emuliatorių. Atsižvelgdamas į tai, kad esu „iTerm2“ OSX vartotojui, galiu pereiti prie „Terminator“ arba „konsole“ sistemoje „Linux“, įdiegdamas ten savo „tmux“ konfigūraciją ir gauti tą pačią žinomą aplinką, prie kurios jau esu įpratęs.
  2. Bendrinkite nuotolinę sesiją su kolega, kad galėtumėte bendradarbiauti realiuoju laiku. Manau, kad realiame pasaulyje jis retai naudojamas, tačiau skamba kietai. Taip, porų programavimas ir kiti šaunūs žodžiai. ?

Taigi, tmux yra atsakingas už du pagrindinius dalykus :

  1. Terminalo tankinimas, seanso / lango / srities valdymas
  2. Išlaikyti sesijos būseną ir išgyventi atjungus nuotolinius scenarijus

Kur iš tikrųjų šviečia tmux, yra (2). Kalbant apie (1), kai kurie žmonės teigia, kad „tmux“ laužo „Unix“ filosofiją, nes bandoma atlikti 2 dalykus, užuot atlikus vieną ir darant tai gerai, ir kad (1) neturėtų būti atsakomybė.

Įterpti vietiniai ir nuotoliniai seansai

Taigi, atsižvelgiant į visa tai, kai kurie žmonės nori naudoti „tmux“ vietinėje mašinoje tik savo terminalo emuliatoriaus viršuje, pirmiausia perkraukdami jį su multipleksu ir langų valdymu. Žmonės, didžiąją laiko dalį praleidę SSH būdami nuotoliniuose kompiuteriuose, naudojasi nuolatiniu sesijos pobūdžiu ir atsparumu tinklo atjungimams.

Bet ar vietiniai ir nuotoliniai atvejai turi būti vienas kitą išskiriantys? Ar galiu juos sujungti? Taip, yra teisėta SSH perduoti į nuotolinį pagrindinį kompiuterį ir pradėti „tmux“ sesiją ten, kai jau esate „tmux“ aplinkoje.

Tai vadinama įdėtomis sesijomis, tačiau kyla tam tikrų kliūčių:

Visų pirma, jūs susiduriate su klausimu: kaip jūs galite valdyti vidinius seansus, nes išorinius seansus visus klavišus susieja ir valdo?

Dažniausias sprendimas yra paspausti prefixdu kartus (priešdėlis yra klavišų susiejimas, kuris įjungia „tmux“ komandų režimu, paprastai tai yra C-b, tačiau kai kurie žmonės nori, kad jis būtų pakeistas į ekraną C-a). Pirmasis priešdėlio klavišo paspaudimas užfiksuojamas išorinėje sesijoje, o antrasis perduodamas vidinei sesijai. Nereikia atlikti jokių papildomų veiksmų, ir tai neveikia.

Tačiau šakninius klavišus - tuos, kurių klausoma visame pasaulyje, o ne komandų režimu - vis tiek užklumpa tik išorinė sesija. Ir man pasirodė, kad dvigubai spausti yra labai nemalonu prefix. Man net nemalonu paspausti vieną kartą, „iTerm2“ nėra tokio dalyko kaip komandų režimas, o aš tiesiog paspaudžiu „ ⌘⌥→“, kad pasirinkčiau dešinėje esančią sritį, užuot siuntęs du atskirus klavišų paspaudimus C-a RightArrow.

Kitas sprendimas yra nustatyti 2 atskirus prefiksus, pavyzdžiui, C-bvietiniam seansui, o C-anuotoliniam. Naudojant toliau pateiktą konfigūraciją, tai reiškia, kad paspaudus C-alokaliai, C-bnuotolinei sesijai bus išsiųstas numatytasis priešdėlis . Čia rasite šį sprendimą.

set -g prefix C-bbind-key -n C-a send-prefix

Bet tai tikrai jaučiasi taip:

Geresnis sprendimas būtų naudoti tą pačią raktų lentelę tiek vietinėse, tiek nuotolinėse sesijose - be atskirų priešdėlių ar dvigubo paspaudimo priešdėlio - ir išjungti visus klavišus ir prefiksų tvarkymą išorinėje sesijoje, kai dirbama su vidine. Kreditai ir šis „Github“ klausimas.

Taigi, kai einu dirbti į vidinę sesiją, išorinėje sesijoje tiesiog paspaudžiu F12ir perjungiu OFFrežimą. Kai taip atsitiks, išorinė sesija OFFbūsenos eilutėje rodo vizualų indikatorių ir pakeičia būsenos linijos vizualinį stilių, kad dar labiau pabrėžtų, jog sesija veikia OFF režime.

Čia yra mano darbo tmux konfigūracijos esmė, kurią neseniai sukūriau (įtraukiami tik atitinkami kūriniai):

Iš esmės mes nustatome F12pagrindinio rakto lentelės klavišų susiejimą. Paspaudus nustatome prefiksą į None, perjungiame dabartinę raktų lentelę į off, tada pakeičiame būsenos eilutės stilius ir priverčiame „tmux“ atnaujinti būsenos eilutę. Atliekamas papildomas žingsnis norint atšaukti dabartinį srities kopijavimo režimą, jei jis yra. Kai tik perjungėme offraktų lentelę ir išjungėme prefiksų tvarkymą, išorinė sesija visiškai neklauso jokių klavišų paspaudimų. Visi klavišų paspaudimai perduodami į vidinę sesiją, o išorinis jų netrukdo.

Visa tai puiku, bet mes turime kažkaip grįžti ir išorinę sesiją vėl paversti įprastu darbo režimu. Štai kodėl F12raktų lentelėje nustatome vieną klavišų susiejimą off, kuris grąžina pradinio F12klavišo paspaudimo efektą .

Be to, konfigūruojame būsenos eilutės vaizdinį indikatorių, kuris rodomas, kai yra dabartinė raktų lentelė off, ir slepia kitaip.

Apibendrindami, atsižvelgdami į šią konfigūraciją, galite sukonfigūruoti vieną vietinę sesiją su vienu langu su 2 langais, kuriuose yra įdėtos nuotolinės sesijos skirtingiems kompiuteriams (žr. Vaizdą įrašo pradžioje).

Nuotolinio konkretaus seanso konfigūracija

Ankstesniame pavyzdyje galite pastebėti, kad išorinio seanso būsenos eilutė yra išdėstyta viršuje, o vidinės sesijos būsenos eilutė yra apačioje. Tai suteikia gražų vaizdinį skirtumą ir nepriverčia būsenos linijų sukrauti viena ant kitos.

Bet kaip įmanoma pritaikyti skirtingas konfigūracijas pagal sąlygines sąlygas?

Na, tai gana lengva. Ar sesija yra nuotolinė, ar lokali, galime nustatyti pagal SSH_CLIENTaplinkos kintamąjį.

if-shell 'test -n "$SSH_CLIENT"' \ 'source-file ~/.tmux/tmux.remote.conf'

Ir ~/.tmux/tmux.remote.confar faile yra saugoma konfigūraciją, kuri bus taikoma tik nuotolinio sesija. Mes keičiame būsenos eilutės padėtį ir pašaliname iš jos kai kuriuos valdiklius (pvz., Laikrodį ir akumuliatorių), nes jie tiesiog atkartoja tuos pačius valdiklius iš vietinės sesijos.

Taigi, viskas. Jei norite pamatyti visa tai veikiant, peržiūrėkite mano „tmux-config“ saugyklą.

Ištekliai ir nuorodos

tmux / tmux: tmux šaltinio kodas - //github.com/tmux/tmux

Tmux naudojimas nuotoliniu būdu vietinio Tmux seanso metu Tiesiog Ianas - //simplyian.com/2014/03/29/using-tmux-remotely-within-a-local-tmux-session/

Įdėtas tmux - //stahlke.org/dan/tmux-nested/

perjungti / išjungti visus klavišų susiejimus · 237 leidimas · tmux / tmux - //github.com/tmux/tmux/issues/237

samoshkin / tmux-config: „Tmux“ konfigūracija, kuri papildo jūsų „tmux“, kad sukurtų jaukią ir vėsią terminalo aplinką - //github.com/samoshkin/tmux-config