複数の名前付きセッションがありますtmux
。たとえば、
$ tmux new -s mysession1
$ tmux new -s mysession2
~/.tmux.conf
セッション名に基づいて、ディレクトリ内のファイルに各セッションを自動的に記録する機能をmyに追加したいと思います。たとえば、上記で提供して作成した~/mytmuxsessions/
シナリオでは、ターミナルウィンドウコマンド(コマンドと同様)の出力を含む次のログファイルを生成します。mysession1
mysession2
script -f file.log
~/mytmuxsessions/mysession1.log
~/mytmuxsessions/mysession2.log
私はそれを調べてみて、これを見つけました:
- tmuxにGNU Screenの「log」コマンドと同等のものはありますか?
- 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-logging
gitリポジトリからインストールします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
.profile
tmux
.bashrc
ここ(1)、ここ(2)またはここ(3)- 3つとも同じ質問に対する答えです。詳しくはこちらをご覧ください。
アップデートがある場合はtmux-logging
同じ方法を使用する必要がありますので、どこかに注意してください。
これを行う方法を見つけようとしていますが、.tmux.conf
アクセス可能な変数に設定されているようなので、セッション情報を取得するのに問題があります。後ろに .tmux.conf
購入しました。
詳しくは
私が使うものはTmuxプラグインマネージャ(tpm
)設置方法はtmux-logging
一度に設置することを意味しますtpm
。以下は、tmux-logging
および追加情報ファイルに記載されているタスクを実行するためのいくつかのクイックコマンドです。tpm
tmux-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]I
CtrlbShifti
次の行が表示されます実際の端末で、緑色の通知バーの代わりに。
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.conf
TMUXプラグインマネージャが最後に保持するように指示する最後の行までそのままにしておきます。
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
。下記のコピーコマンドを実行してください。もう一度言いますが、将来のアップグレードによってファイルが削除されないように、ファイルをホームフォルダ(~
別名)に保存しました。以下で選択したディレクトリとファイル名の代わりに、自分に合ったディレクトリとファイル名を選択できます。$HOME
tmux
$ 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:22
405
mytmuxsession1-1-1.log
Mar 2 13:02
1.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.com。p1、p2とp3。
長い例を示すのではなく、一連のコマンドだけを表示します。実際のログについては、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
別のウィンドウを開き、mysession1
2番目のウィンドウ内で別のウィンドウを開き、ログがどのように終了するかを見てみましょう。 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
ログファイル名の個人設定を維持する方法を知ることができます。