自分のセッション名に基づいてディレクトリ内のファイルにすべての「tmux」セッションを自動的に記録するにはどうすればよいですか?

自分のセッション名に基づいてディレクトリ内のファイルにすべての「tmux」セッションを自動的に記録するにはどうすればよいですか?

複数の名前付きセッションがありますtmux。たとえば、

$ tmux new -s mysession1
$ tmux new -s mysession2

~/.tmux.confセッション名に基づいて、ディレクトリ内のファイルに各セッションを自動的に記録する機能をmyに追加したいと思います。たとえば、上記で提供して作成した~/mytmuxsessions/シナリオでは、ターミナルウィンドウコマンド(コマンドと同様)の出力を含む次のログファイルを生成します。mysession1mysession2script -f file.log

  1. ~/mytmuxsessions/mysession1.log
  2. ~/mytmuxsessions/mysession2.log

私はそれを調べてみて、これを見つけました:

  1. tmuxにGNU Screenの「log」コマンドと同等のものはありますか?
  2. https://blog.sleeplessbeastie.eu/2019/10/28/how-to-store-the-contents-of-tmux-pane/

これらの質問は、キーをコマンドにバインドしようとしますが、自動的に実行したいと思います。つまり、~/.tmux.conf入力して忘れることができるのです。たとえば、このコマンドが実行する作業は、ログファイルの現在の出力をすべて処理することです。

capture-pane -b temp-capture-buffer -S - \; save-buffer -b temp-capture-buffer ~/tmux.log \; delete-buffer -b capture-buffer

しかし、私が望むのは、私のセッション名に基づいてターミナル出力をログファイルに継続的に保存するコマンドに入れることができるLinux scriptコマンドと似ています。script -f mysession.log~/.tmux.conf

答え1

の使用方法が見つかりません.tmux.conf。 「動的」とは、お客様の場合、セッション名に基づいていることを意味します。Unixタイムスタンプ私は。ただし、基本コードは使用できます。tmux ロギング;私に合ったものを得るためにソースコードを修正しました。

このソリューションは、特定のセッションのすべての内容を1つのログファイルに保存するわけではありません。これは可能ですが、そのセッションに存在する可能性のあるさまざまなウィンドウとペインを組み合わせることは困難です。ただし、このソリューションはセッションの各ウィンドウのログファイルを保存するため、すべての入力と出力がログファイルに含まれます。いつでもから派生することもtmux-plugins/tmux-login、一緒に構成した内容に基づいて独自のコードを作成し、必要なものを使用することもできます。


長い話を短く

tmux-logginggitリポジトリからインストールしますtmux-plugins

filename_suffix目的の形式に合わせて変数定義を変更します。これはで行われなければなりません/path/to/tmux-plugins/tmux-logging/scripts/variables.sh

別のスクリプトにコピーしましたtoggle_logging.sh。呼び出しました~/.ensure_tmux_logging_on.sh。私のディレクトリにあるので、$HOME今後のアップデートではtmux削除されません。if is_logging何もしないように(またはメッセージのみを出力するように)スクリプトを変更してください。関連するelseブランチを変更せずにそのままにします。

~/.ensure_tmux_logging_on.sh.bash_profile(または、または.bash_login非ログインシェルから呼び出されていることを確認する)から呼び出します。常に非ログインシェルを開くので、前のスクリプトのいずれかからインポートしないと機能しません。バラより.login.profiletmux.bashrcここ(1)ここ(2)またはここ(3)- 3つとも同じ質問に対する答えです。詳しくはこちらをご覧ください。

アップデートがある場合はtmux-logging同じ方法を使用する必要がありますので、どこかに注意してください。

これを行う方法を見つけようとしていますが、.tmux.confアクセス可能な変数に設定されているようなので、セッション情報を取得するのに問題があります。後ろに .tmux.conf購入しました。


詳しくは

私が使うものはTmuxプラグインマネージャtpm)設置方法はtmux-logging一度に設置することを意味しますtpm。以下は、tmux-loggingおよび追加情報ファイルに記載されているタスクを実行するためのいくつかのクイックコマンドです。tpmtmux-loggingノート、すでに持っている場合は、次のガイドラインにtpm従ってください。閲覧tmux-loggingファイル、つまり行を追加

set -g @plugin 'tmux-plugins/tmux-logging'

あなたのプラグインのリストに~/.tmux.conf

tpmこのコマンドを使用して(少なくとも標準インストールの場合)

$ test ! -d ~/.tmux/plugins/tpm && \
 echo -e "\n\nYou don't have \`tpm', continue with the next commands\n" || \
 echo -e "\n\n\
You have \`tpm'.
\033[0;31mPAY ATTENTION TO THIS MESSAGE\x21\033[0m
Follow the instructions at
'https://github.com/tmux-plugins/tmux-logging/'
then
\033[0;32mgo to the 'After getting tmux-logging' part of the answer\033[0m\n"

そうでない場合はtpm実行してください。

#(prompt can be in tmux or not)
## It's best, but not necessary, to get in the directory where we'll be doing stuff.
bbd025@MACHINE $ cd
## check the existence of ~/.tmux/plugins/tpm directory, 
##+ create it if it doesn't exist
bbd025@MACHINE $ test -d ~/.tmux/plugins/tpm || mkdir -p ~/.tmux/plugins/tpm
## clone in the tpm code
bbd025@MACHINE $ git clone https://github.com/tmux-plugins/tpm \
   ~/.tmux/plugins/tpm
## create ~/.tmux.conf if it doesn't exist
bbd025@MACHINE $ test -f ~/.tmux.conf || touch ~/.tmux.conf
## Add the lines to ~/.tmux.conf as directed by the READMEs. Note that
##+ that the lines with only a '.' allow for spacing between the end of
##+ anything currently in your ~/.tmux.conf and these lines
bbd025@MACHINE $ cat <<'EOF' | sed 's/^\.$//g;' >> ~/.tmux.conf
.
.
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# -v- OUR LOGGING PLUGIN -v-
set -g @plugin 'tmux-plugins/tmux-logging'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'github_username/plugin_name#branch'
# set -g @plugin '[email protected]:user/plugin'
# set -g @plugin '[email protected]:user/plugin'

#Initialize TMUX plugin manager(keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
EOF
bbd025@MACHINE $

tmux-loggingを取得した後

別の方法で別のコンテンツをインストールまたは構成する場合は、使用する必要がありtmux-loggingます。/my/path/to/tmux-logging/~/.tmux/plugins/tmux-logging/

まだ開始していない場合は、tmuxセッションを開始してください。

$ tmux

下部に緑色のバナーの種類が表示され、その項目にあることがわかりますtmux[Prefix]+ Shift+を押します。 (+iとも呼ばれ、デフォルトでは+を最初に押してから+を押します。)[Prefix]ICtrlbShifti

次の行が表示されます実際の端末で、緑色の通知バーの代わりに。

TMUX environment reloaded.
Done, press ENTER to continue.

~によるとENTER

それでは編集してみましょう~/.tmux/plugins/tmux-logging/scripts/variables.sh

必要な出力ファイル名に近いもの(OP)の場合(ただし、新しいウィンドウやウィンドウから呼び出すときは上書きも混乱もしません。少なくともそうなると思います)、次のように変更します。ライン:

# General options
# Next, commented line has original variable
#replaced#filename_suffix="#{session_name}-#{window_index}-#{pane_index}-%Y%m%dT%H%M%S.log"
filename_suffix="#{session_name}-#{window_index}-#{pane_index}.log"

(更新時にこの情報を安全に保つ方法については、注[1]tmuxを参照してください。)

-#{window_index}-#{pane_index}セッションで開かれたことがない場合は、複数のウィンドウを削除できます。これにより、OPに必要なものと正確に一致するログファイル名が提供されます。複数のウィンドウで終わるとロギングがどうなるかはわかりませんが、上書きしないと乱雑になると思います。ちなみに、表示される変数は~/.tmux/plugins/tmux-logging/scripts/shared.sh

default_logging_pathファイル内でいくつかの行を変更することもできますが、これは処理できるもの~/.tmux.confなので混乱しませんでした。

私のやり方 - 私のユーザー名がログファイルの一部になり、完全に一意で追跡可能なタイムスタンプが欲しい、時系列でソートしたいと思います。 (そして私のファイルが1行に80文字を超えるのは好きではありません。) - 行を変更しているので

# General options
# -v- original before change by bballdave025 -v- , 2022-02-28
#filename_suffix=\
#"#{session_name}-#{window_index}-#{pane_index}-%Y%m%dT%H%M%S.log"
filename_suffix="bbd025-%s\
-#{session_name}-#{window_index}-#{pane_index}-%Y%m%dT%H%M%S%z.log"

tmux-ファイル名の前に何かをしたくない場合は、variables.shファイルをもう一度変更する必要があります。若干異なるロギングオプションはファイル名のプレフィックスが異なるため、私のコンピュータではこれを行いませんが、この回答では行いました。

したがって、プレフィックスが必要ない場合は、variables.sh次の行に変更してください。

# original commented out on the line below
#default_logging_filename="tmux-${filename_suffix}"
default_logging_filename="${filename_suffix}"

今必要なもの~/.tmux.conf。他の法的経路はここに配置できます。スクリーンキャプチャおよび/またはログバッファを使用しtmux-loggingてログ記録オプションを続行すると、スクリーンキャプチャまたはバッファを含む完全な履歴が自動起動ログファイルと同じディレクトリに保存されます。この行をファイルのどこに置くかはまったく重要ではありませんが、~/.tmux.confTMUXプラグインマネージャが最後に保持するように指示する最後の行までそのままにしておきます。

set -g @logging-path "$HOME/mytmuxsessions"
set -g @screen-capture-path "$HOME/mytmuxsessions"
set -g @save-complete-history-path "$HOME/mytmuxsessions"

次に、新しいスクリプトにコピーして、そのスクリプトがスクリプト(または非ログインスクリプトから呼び出されるように決定されたすべての項目)toggle_logging.shに含まれていることを確認します。~/.bash_profile

実際に~/.bashrc私の~/.bash_profileコードから次のようになります。

# @file  .bash_profile

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

次の行があれば~/.bashrcコメントアウトできます。

# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return

到着

## If not running interactively, don't do anything
#[[ "$-" != *i* ]] && return

それ以外の場合は、ログインシェルでのみ使用するためにfor環境と機能を維持したい場合は、末尾に入れる行を追加するか、ログインしていないスクリプト用~/.bashrcにロードされるファイルを追加します。~/.bashrc~/.bash_login

ついに我々はそれを得たtoggle_logging.sh。下記のコピーコマンドを実行してください。もう一度言いますが、将来のアップグレードによってファイルが削除されないように、ファイルをホームフォルダ(~別名)に保存しました。以下で選択したディレクトリとファイル名の代わりに、自分に合ったディレクトリとファイル名を選択できます。$HOMEtmux

$ cp ~/.tmux/plugins/tmux-logging/scripts/toggle_logging.sh \
     ~/.ensure_tmux_logging_on.sh

tpm(使用されているオプションがない場合は、tmux-logging複製または構築した場所からスクリプトにアクセスする必要がありますtmux-logging。)

~/.ensure_tmux_logging_on.shそれでは、以下のように変更してみてください。 (私がコメントしたソースコードを保持する必要はありません。その部分があるので、元のテキストを検索して置き換えたり、私のようにコメントすることができます。これにより、新しいコンテンツがどこにあるべきかを知ることができます。)

---

### changed for auto-logging (I often put in my username and date of change)
### bballdave025, 2022-02-28
#orig#CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

#orig#source "$CURRENT_DIR/variables.sh"
#orig#source "$CURRENT_DIR/shared.sh"

## new for tmux auto-logging, bballdave025 2022-02-28
TMUX_LOGGING_SCRIPTS_DIR="$HOME/.tmux/plugins/tmux-logging/scripts"
CURRENT_DIR="$TMUX_LOGGING_SCRIPTS_DIR"
  ## Not really our current dir, but it allows other code called
  ##+ downstream to work.

source "$TMUX_LOGGING_SCRIPTS_DIR/variables.sh"
source "$TMUX_LOGGING_SCRIPTS_DIR/shared.sh"

---

### original function commented out, bballdave025 2022-02-28
#stop_pipe_pane() {
#  tmux pipe-pane
#  display_message "Ended logging to $logging_full_filename"
#}

### new function added, bballdave025 2022-02-28
confirm_logging()
{
  display_message "Logging already happening to ${logging_full_filename}"
}

---

#original comment## starts/stop logging
# starts/continues logging ( bballdave025, 2022-02-28 )
#orig#toggle_pipe_pane() {
## -v- new function name -v- , bballdave025, 2022-03-09
ensure_pipe_pane_on()
{
  if is_logging; then
    #orig#set_logging_variable "not logging"
    #orig#stop_pipe_pane
    # -v- bballdave025 2022-02-28 -v- first line probably unneeded (?)
    set_logging_variable "logging"
    confirm_logging
    # everything from here is as in the original
  else
    set_logging_variable "logging"
    start_pipe_pane
  fi
}

## -v- main changed -v- by bballdave025, 2022-03-08
#orig#main() {
#orig#  if supported_tmux_version_ok; then
#orig#    toggle_pipe_pane
#orig#  fi
#orig#}

main()
{
  if supported_tmux_version_ok; then
    ensure_pipe_pane_on
  fi
}
main

---

私と同じくらい冗長である必要はありません。つまり、すべてのコメントと前の行は必要ありません。何が変わっているのか明確になることを願っています。このコードをより簡単にする方法があります。何が起こっているのかを理解したら、そうすることもできます。

スクリプトが実行可能であることを確認してください

$ chmod +x ~/.ensure_tmux_logging_on.sh

~/.bash_profileこれで、非ログイン端末(a、aなどのソース)から呼び出されるファイルにそれを追加できるコードがいくつかあります~/.bashrc~/.bash_profile私の例では、非ログイン画面に対して `~/.bash_profile として呼び出したので、~/.bashrcそこに私の行を追加します。

~/.ensure_tmux_logging_on.shこの行を使用すると、新しい端末に最初に入ったときに実行されます。あなたの(または他のファイル)tmuxどこにでも次の行を追加してください。~/.bashrc私は最後に入れました。

if [ ! -z $TMUX ]; then
  $HOME/.ensure_tmux_logging_on.sh
fi

私のシステム「RHEL 8」(RedHatベース)でテストされました。

ショートバージョン:動作します。次のセクションをスキップできますが、下記の5つの項目を確認してみることをお勧めします。

以下は、知っておくべき重要な点です。

1)次に、OPのコマンドを実行します。

$ tmux new -s mysession1

その結果、ログファイルが生成され、

~/mytmuxsessions/mysession1-1-1.log

同様に$ tmux new -s mysession2、ログファイルが生成されます。~/mytmuxsessions/mysession2-1-1.log

2)これらのセッションで新しく作成されたウィンドウ/ウィンドウは、ターミナルプロンプトでコマンドを使用して名前で作成した場合でも、数字で表示されます。

三)セッション名を指定しないと(端末プロンプトで新しいウィンドウを起動し、(   -s   )SESSION_NAME `オプションを使用してのみ提供可能)、割り当てられたセッション番号のみを取得できます。

4)OPに設定すると、新しいセッションのログは以前に作成されたセッションと同じ名前を持ちます。つまり、2回目の使用時に古いtmux new -s mysession1ログファイルが上書きされます。はいがなければ明確ではないので、ここに1つあります。

$ ls -lAh ~/mytmuxsessions # to see that mysession1-1-1.log is already there
-rw-r--r--. 1 bbd025 bbd025 405 Mar   1  10:22 mysession1-1-1.log
-rw-r--r--. 1 bbd025 bbd025 824 Feb   28 17:40 mysession2-1-1.log
$ tmux new -s mysession1 # I'll enter a new tmux session after this command
(tmux)$ # Some stuff.
(tmux)$ echo "Putting text, I/O, etc. in the logfile"
(tmux)$ alias ls='ls --color=auto'
(tmux)$ type ls
ls is aliased to 'ls --color=auto'
(tmux)$ tmux kill-session -t mysession1
$ ls -lAh ~/mytmuxsessions
-rw-r--r--. 1 bbd025 bbd025 1.6K Mar   2  13:02 mysession1-1-1.log
-rw-r--r--. 1 bbd025 bbd025 824  Feb   28 11:40 mysession2-1-1.log

sizeバイトでmytmuxsession1-1-1.log生成された最初のログファイルはもう存在しません。代わりに、sizeで作成しました。Mar 1 10:22405mytmuxsession1-1-1.logMar 2 13:021.6K

このオーバーライドを回避するには、BSDコマンド形式に特定の種類の日付文字列を含めますdate。たとえば、tmux-logging をvariables.sh次のように変更します。

filename_suffix="#{session_name}-#{window_index}-#{pane_index}\
-%Y%m%dT%H%M%S%z.log"

これはオーバーライドと同じではありません。期間tmuxさっき話したその会。

5)これが本当に必要かどうかはわかりませんが、私のアイテム~/.bashrc(または~/.bash_profile他のアイテム)に以下を追加しました:より多くの説明/オプションを含むサンプルバージョンもあります。

## Function to be run every time one exits a bash terminal
finish()
{
  if [ ! -z $TMUX  ]; then
    $HOME/.tmux/plugins/tmux-logging/scripts/toggle_logging.sh
  fi
}

trap finish EXIT

短い はい

テストする前に、端末をシャットダウンして再起動または実行する必要がありますsource ~/.bashrc(または編集した同様のファイルをインポートする必要があります)。私は2番目の方法を好みますが、わからない場合などは再起動することをお勧めし~/.bash_profileます~/bashrc

編集するこの答えよりも過剰なように感じるより長い例があります。ぜひ見たい場合はスクリーンショットを撮って添付しておきました。現在のページ(p1、p2、およびp3)は次のようになります。www.google.comp1p2p3

長い例を示すのではなく、一連のコマンドだけを表示します。実際のログについては、tmux新しいセッション、ウィンドウ、またはウィンドウに入った後、いくつかのコマンドを実行し、いくつかの説明を書きました。最後に生成されたファイルを表示します。

私のシステムについてもっと詳しく説明する必要があります。 PuTTYを介してRHEL8システムへのSSH接続を確立することで、基本的な端末を提供しました。そこから私は走る

$ tmux new -s mysession1

(これにより、セッション:mysession1;ウィンドウ:1;とウィンドウ:が開きます1。ログファイルも起動しますmysession1-1-1.log。)

コメントを付けて[Prefix]+を押した後の端末の外観は次のとおりです[w]tmux

┌──────────────────────────────────────────────────────────────────────────────┐
│(0)  - mysession1: 1 windows (attached)                                       │
│(1)  └─> 1 bash* (1 panes) "bbd025@MACHINE: /home/bbd025"                     ┆
│┌ 1 (sort: index)────────────────────────────────────────────────────────────┐┆
││ bbd025@MACHINE:~                                                           ││
││ $ # I'm in tmux, and it looks like it's logging!                           ││
││ bbd025@MACHINE:~                                                           ││
││ $ # I'll press [Prefix]+[w] to see session info & then [ENTER] to get back ││
││ bbd025@MACHINE:~                                                           ││
││                                 ┌───┐                                      ││
││                                 │ 1 │                                      ││
││                                 └───┘                                      ││
│└────────────────────────────────────────────────────────────────────────────┘│
│[mysession1:bash*                  "bbd025@MACHINE: /home/bbd" HH:MM dd-mmm-yy│
└──────────────────────────────────────────────────────────────────────────────┘

[Prefix]+w上に見えるものを呼んでください。セッションに戻るには、そのセッションが強調表示されていることを確認し(このセッションは唯一のセッションなので、何も実行する必要はありませんq)を押しますENTER

セッションを分離して開始しますmysession2。申し訳ありません。コマンドラインをめちゃくちゃにしましたが、ログファイルのサイズが正確になりたいです。

$ tmux detach-client -s mysession1

今、私たちはnon-tmuxシェルに戻りました。別のコードブロックを表示しても、同じ端末位置にありながら端末のコードを置き換えます。

$ tmux new -s mysession2

tmux表示される端末にはログファイルがあります。mysession2-1-1.log

このとき[Prefix]+を使用するとwポップアップウィンドウが開きます。

(0)  - mysession1: 1 windows
(1)  └─> 1: bash* (1 panes) "bbd025@MACHINE: /home/bbd025"
(2)  - mysession2: 1 windows (attached)
(3)  └─> 1: bash* (1 panes) "bbd025@MACHINE: /home/bbd025"
$ tmux detach-client -s mysession2

killができる非tmuxシェルに戻りましょうmysession2

$ tmux kill-session -t mysession2

別のウィンドウを開き、mysession12番目のウィンドウ内で別のウィンドウを開き、ログがどのように終了するかを見てみましょう。 tmux 以外の端末で起動します。

tmux attach -t mysession1

元のウィンドウに入力した内容がすべて表示されますtmux new -s mysession1

$ tmux new-window -n second_window

tmux bash新しい空の端末が表示されます。ログファイルがありますmysession1-2-1.log

$ tmux ls
mysession1: 2 windows (Created Mon Feb  28 12:02:06 2022) [80x29] (attached)
$ # I press [Prefix]+[n] to get to the next `tmux` window, i.e. the one with
$ #+ logfile, `mysession1-1-1.log`
$ tmux split-window -v # This is the same as [Prefix]+[%]

これで、2つの端末がダッシュラインで区切られています。 1つはもう1つ上にあります。下の端末にログファイルがありますmysession1.1.2

$ tmux display-panes
$ # You'll have seen numbers on each pane. The bottom one should have
$ #+ shown '2'. If you want to make sure you are typing in pane 2, do
$ tmux select-pane -t 2
$ # You could also have done [Prefix]+[q]+[2]

ウィンドウ2では、名前のない新しいウィンドウを開きます。

$ tmux new -w

これで、ログファイルがあるtmux端末にあります0-1-1

次に、tmux kill-serverログファイルを最終的に確認しましょう。

# In T0
$ ls -Ss1pq --block-size=1
total 28672
12288 mysession1-1-1.log
 4096 0-1-1.log
 4096 mysession1-1-2.log
 4096 mysession2-1-1.log
 4096 mysession1-2-1.log
$ ls -lAh
total 28K
-rw-r--r--. 1 bbd025 bbd025 1.3K Mar  8 12:03 0-1-1.log
-rw-r--r--. 1 bbd025 bbd025 8.5K Mar  8 11:49 mysession1-1-1.log
-rw-r--r--. 1 bbd025 bbd025  767 Mar  8 11:49 mysession1-1-2.log
-rw-r--r--. 1 bbd025 bbd025  648 Mar  8 11:49 mysession1-2-1.log
-rw-r--r--. 1 bbd025 bbd025  725 Mar  7 17:41 mysession2-1-1.log

メモ:

[1]新しいfilename_suffix変数は更新後も保持されないことがありますtmux。変更を覚えてアクセスできるようにする(OPの場合)、以下を自分のエントリに追加します。~/.bash_profile

export MY_TMUX_FNAME_SUFFIX_LINE='filename_suffix="#{session_name}-#{window_index}-#{pane_index}.log"'

私の場合は、以下を追加します。作業を簡単にするために、1行につき80文字のルールをスキップしました。

export MY_TMUX_FNAME_SUFFIX_LINE='filename_suffix="bbd025-%s-#{session_name}-#{window_index}-#{pane_index}-%Y%m%dT%H%M%S%z.log"'

デフォルトでは、環境変数が表示されます。

echo $MY_TMUX_FNAME_SUFFIX_LINE

今後の更新後にもう一度確認して、tmuxログファイル名の個人設定を維持する方法を知ることができます。

関連情報