Czy mogę zobaczyć, co się dzieje w sesji tmux bez dołączania się do tego?

16

Często używam tmuxdo uruchomienia zadania, które będzie działać przez jakiś czas. Będę okresowo wracać i sprawdzać, używając, tmux -aa następnie rozłączać się, jeśli nadal nie został ukończony, i sprawdzać ponownie później.

Czy jest jakiś sposób, aby zobaczyć krótką migawkę tego, co dzieje się w sesji bez pełnego załączania? Szukam czegoś w rodzaju teoretycznego robienia tailsesji w celu uzyskania ostatniego bitu wyjściowego (ale jeśli mogę uniknąć tworzenia kolejnego pliku z kopią danych wyjściowych tym lepiej)

Może zadziałałoby również podłączenie i natychmiastowe odłączenie. Próbuję zapisać naciśnięcia klawiszy, być może takie polecenie można wykonać zdalnie,
tj. ssh root@server tmux --tail?

cwd
źródło

Odpowiedzi:

17

Myślę, że capture-panemoże pasować do twoich potrzeb:

tmux capture-pane -pt "$target-pane"

(zobacz „panel docelowy” na stronie podręcznika, aby dowiedzieć się, jak określić panel)

Domyślnie to polecenie zrzuci bieżącą zawartość określonego panelu. Możesz określić zakres linii za pomocą opcji -Si -E(numery linii początkowej i końcowej): pierwsza linia to 0, a liczby ujemne odnoszą się do linii z historii „przewijania” w panelu. Dzięki dodaniu -S -10otrzymasz dziesięć ostatnich wierszy historii oraz bieżącą zawartość panelu.

tmux capture-pane -pt "$target-pane" -S -10

-pOpcji dodano 1,8. Jeśli korzystasz z wcześniejszej wersji, możesz to zrobić zamiast tego:

tmux capture-pane -t "$target_pane" \; save-buffer - \; delete-buffer

Ale pamiętaj o tych średnikach, jeśli wydajesz to polecenie, sshponieważ zdalna powłoka doda dodatkowy poziom interpretacji powłoki (średniki muszą być przekazywane jako argumenty do ostatecznej komendy tmux , nie mogą być interpretowane ani przez lokalną, ani zdalną muszla).

Chris Johnsen
źródło
1
Naprawdę masz ten tag ... Świetna odpowiedź (jak zwykle).
jasonwryan
Można również dodać -edla znaków ucieczki ANSI (kolor i tak dalej). To sprawia, że ​​fajny mnemonik-pet
latające owce
1

Nie całkiem. Jednym z pomysłów, które przychodzi na myśl, jest rozpoczęcie długiego procesu ( $lrp), a następnie okresowe, bez ponownego dołączania, uruchamianie list-windowsodpowiedniej sesji.

W pewnym momencie nazwa okna tmux z $ lrp zmieni się z powrotem na domyślną, ogólnie twoją powłokę, i będziesz mógł zobaczyć, że $ lrp zostało zakończone.

┌─[Veles ~]
└─╼ tmux list-windows -t 0
0: App1  (1 panes) [142x51] [layout b27d,142x51,0,0,0] @0
1: SSH  (1 panes) [142x51] [layout b27e,142x51,0,0,1] @1
2: IRC  (1 panes) [142x51] [layout b27f,142x51,0,0,2] @2
3: Shell- (1 panes) [142x51] [layout b280,142x51,0,0,3] @3
4: $lrp* (1 panes) [142x51] [layout b281,142x51,0,0,4] @4 (active)
┌─[Veles ~]
└─╼ tmux list-windows -t 0
0: App1  (1 panes) [142x51] [layout b27d,142x51,0,0,0] @0
1: SSH  (1 panes) [142x51] [layout b27e,142x51,0,0,1] @1
2: IRC  (1 panes) [142x51] [layout b27f,142x51,0,0,2] @2
3: Shell- (1 panes) [142x51] [layout b280,142x51,0,0,3] @3
4: bash* (1 panes) [142x51] [layout b281,142x51,0,0,4] @4 (active)
jasonwryan
źródło
dobry pomysł. Nadal jestem jednak zdezorientowany $lrp- czy była to zmienna, o której wspomniałeś? czy możesz podać przykład, w jaki sposób zostałby wykorzystany? nie widziałem na $lrpliścieman tmux
cwd
@cwd To tylko symbol zastępczy dla twojego procesu (powiedz rsyncczy cokolwiek) ... :)
jasonwryan