Есть ли эквивалент в команде GNU Screen «log» в tmux?


35

Я интенсивно использую экранную команду «log» для записи результатов сеанса в файл, когда я делаю изменения в данной среде. Я искал справочную страницу tmux, но не смог найти эквивалент. Кто-нибудь знает о подобной функции в tmux, или я должен написать свои собственные сценарии оболочки, чтобы сделать это?

РЕДАКТИРОВАТЬ: я знаю «скрипт» и другие утилиты, которые позволяют мне записывать сеанс. Причиной того, что функциональность экрана является настолько полезной, является возможность определить переменную файла журнала, которая использует экранирование строк для уникальной идентификации каждого сеанса.

Например, у меня есть функция оболочки, которая, учитывая имя хоста, будет SSH к этому хосту в новом окне экрана и установить заголовок окна в имя хоста. Когда я запускаю журнал этой сессии, он начинается с заголовка окна.

Если эта функциональность не существует в tmux, мне придется создать новый набор функций оболочки для настройки «сценариев» сеансов, которые я хочу регистрировать. Это не очень сложно, но это может не стоить усилий, учитывая, что экран делает именно то, что мне уже нужно.

Ответы:


39

Дайте мне посмотреть, правильно ли я расшифровал вашу конфигурацию экрана :

  • Вы используете что-то вроде logfile "%t-screen.log"(вероятно, в .screenrcфайле), чтобы настроить имя файла журнала, который будет запущен позже.
  • Вы используете экранную команду title <hostname>(Ca A), чтобы установить заголовок нового окна, или вы запускаете новый сеанс экрана.
    screen -t <hostname> ssh0 <hostname>
  • Вы используете экранную команду Ca H (Ca: log) для переключения регистрации в сконфигурированный файл.

Если это так, то это почти эквивалентно ( для поддержки #W в команде shell требуется tmux 1.3+ pipe-pane; pipe-paneдоступен в tmux 1.0+):

  • В файле конфигурации (например .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Используйте tmux rename-window <hostname>(Cb,), чтобы переименовать существующее окно, или
    используйте, tmux new-window -n <hostname> 'ssh <hostname>'чтобы запустить новое окно tmux , или
    используйте, tmux new-session -n <hostname> 'ssh <hostname>'чтобы начать новый сеанс tmux .
  • Используйте Cb H для переключения регистрации.

Нет уведомления о том, что журнал был переключен, но вы можете добавить его, если хотите:

bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Toggled logging to $HOME/#W-tmux.log'

Примечание. Вышеуказанная строка отображается так, как если бы она была в файле конфигурации ( .tmux.confили один из вас source). tmux должен видеть как обратную косую черту, так и точку с запятой; если вы хотите настроить это из оболочки (например tmux bind-key …), вам придется экранировать или заключить в кавычки оба символа соответствующим образом, чтобы они были доставлены в tmux без изменений. Похоже, не существует удобного способа показывать разные сообщения для включения / выключения при использовании только одной привязки (возможно, вы сможете что-то с этим подстроить if-shell, но, вероятно, это будет некрасиво). Если две привязки приемлемы, попробуйте это:

bind-key H pipe-pane "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Started logging to $HOME/#W-tmux.log'
bind-key h pipe-pane \; display-message 'Ended logging to $HOME/#W-tmux.log'

Ницца! Похоже, это делает именно то, что мне нужно.
Мурали Суриар

Hrrm. Поэтому попытка сделать это из оболочки приводит к некоторым проблемам. Любые предложения относительно того, как управлять передачей всей линии в tmux без изменений? "
Murali Suriar

2
@KamilDziedzic: Вы можете попытаться включить tmux pipe-pane …команду в свой default-command(т.е. перед запуском оболочки); конечно, это будет работать только для панелей «по умолчанию» (например, ничего не начиналось с явных команд new-window sqlite3). Были намеки на то, что поддержка «hook» может появиться в некоторых будущих версиях tmux ; это может позволить вам настроить команду (например pipe-pane …) , которые будут автоматически запускаться после какой - либо другой команды new-session, new-windowили split-pane).
Крис Джонсен

1
@sebelk: Если вы считаете, что отдельная строка является «записью», вы можете использовать оболочку readи dateорганизовать ее. Напримерbind-key H pipe-pane -o 'exec bash -c "while IFS= read -r line; do echo \"\$(date +%%Y%%m%%dT%%H%%M%%SZ%%z): \$line\"; done" >>$HOME/"#W-tmux.log"'
Крис Джонсен

1
@ChrisJohnsen, ... это могло бы сделать намного эффективнее, если бы мы знали, что bash был 4.1 или новее - создание подоболочки для запуска новой копии dateкаждой строки вывода будет серьезным ударом по производительности! Намного лучше printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(экранирование по мере необходимости для включения в конфигурационный файл tmux, таким образом, вероятно, удваивая %sи экранируя "s).
Чарльз Даффи

5

Вот плагин tmux, который позволяет вести логи без связывания клавиш в .tmux.conf:

https://github.com/tmux-plugins/tmux-logging

Особенности:

  • prefix + Pпереключает логирование панели. Вывод очищается от нежелательных символов ANSI!
  • prefix + Alt + P сохраняет полную историю панели в файл

4

Просматривая документацию по tmux, я не могу найти эквивалента регистрации в окне экрана. Похоже, вам придется использовать функции оболочки, чтобы делать то, что вы хотите, или просто использовать экран. Вы можете включить отладку, которая регистрирует как серверную, так и клиентскую стороны, но также включает в себя множество посторонних журналов, связанных с tmux, так что это не совсем то, что вы просите.

Вы можете использовать буфер обмена tmux, чтобы автоматизировать сохранение буфера в другой сеанс, который будет настроен на прием содержимого буфера обмена и сохранение в файл. Это кажется немного хакерским.


1
Это был и мой вывод. Я решил придерживаться экрана на данный момент, и это позор, так как помимо этого упущения, tmux кажется довольно хорошим.
Мурали Суриар

1

я делаю это используя скрипт, это из моего файла tmux.conf

bind ^C new-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"
bind c new-window "script -f /home/jcosta/mydocs/work/logs/$( date '+%d%m%Y_%H%M%S')_$$.log"
bind | split-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"

1
Плохая замена logкоманде экрана , которая позволяет регистрироваться на лету. Но тогда, если вы находитесь в tmux и хотите использовать логи экрана, вам все равно нужно запустить новую оболочку.
Arcege
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.