Dockerでターミナル操作を記録&再生したくて、scriptとscriptreplayを試してみた
なにこれ?
普段環境を汚したくないので、Docker内で色々作業をすることが多いのですが、さっき何やったっけ?となってしまうことがありました。
そこで、作業ログを残す方法ないかなと探してみたら、ターミナルログを記録する方法を見つけました。
scriptコマンドを使えば、ターミナルのやりとりをまるっと記録できるらしいです。
今回はUbuntu 24.04のDockerイメージを使って、scriptによる記録をやってみます。
scriptコマンドって何?
scriptは、ターミナル上で行われた操作を入力・出力の両方から記録してくれるコマンドらしいです。
以下のような内容を記録してくれる
- 実行したコマンド
- 出力
- 画面制御文字(色変えとかカーソル移動のやつ)
なので、あとで何をやったっけ?と振り返るときや、検証の手順を残しておきたいときに便利っぽいです。
Ubuntu 24.04のイメージubuntu:24.04
には、標準でscriptが入ってるから面倒なセットアップなしで使えていい感じです。
docker runしてみる
下記のコマンドを叩くと、/workspace
で session-日付.log
を生成しながら作業できるようになります。
docker run -it --rm \
-v "$(pwd)":/workspace \
ubuntu:24.04 \
bash -c "cd /workspace && script -f session-$(date +%Y%m%d-%H%M%S).log"
-
-v "$(pwd)":/workspace
ホストのカレントディレクトリをコンテナの/workspace
にマウント -
script -f session-$(date +%Y%m%d-%H%M%S).log
-f
オプションでリアルタイムにログファイルを書き込む
あとは普通に作業してコンテナからexitすると session-YYYYMMDD-HHMMSS.log
ができあがります。
色々動かしてみた結果
色々動かしたあとsessionログを確認してみると、それっぽいログが残っていました。
# ls
Dockerfile Makefile
# pwd
/workspace
# vim aaa
sh: 3: vim: not found
ただ、vimみたいなフルスクリーンで画面がガラッと変わる系のコマンドは、ログが文字化けっぽくなることがあるみたいです。
[?1049h[22;0;0t
↑こういう謎の制御文字だらけになって、見てもよく分からん…という感じになりました。
timing情報も記録して再生してみる
どうやら色々調べてみると、-T
オプションを使ってタイミング情報も一緒に記録しておくと、scriptreplay
で再生できるようです。
docker run -it --rm \
-v "$(pwd)":/workspace \
ubuntu:24.04 \
bash -c "cd /workspace && script -T timing-$(date +%Y%m%d-%H%M%S).log -f session-$(date +%Y%m%d-%H%M%S).log"
記録が終わったら、以下で再生してみます。
docker run -it --rm \
-v "$(pwd)":/workspace \
ubuntu:24.04 \
bash -c "cd /workspace && scriptreplay timing-[時間].log session-[時間].log"
これだと実行時の実際の速度でリプレイされるため、コマンド入力と出力の再現がゆっくりに感じることがありました。
ログをサクッと見返したいため、-m
オプションを使ってみます。
scriptreplay -m 0.01 timing-[時間].log session-[時間].log
-
-m
: 表示間の最大待機時間を指定(秒)-
0.01
にするとサクサク動く -
0
にするとなぜか効かないっぽいので0より大きくする必要はありそう
-
あと、-d
で再生速度をN倍にできるオプションもありますが、遅いものは何倍にしても遅い気がするので、-m
のほうが体感的にはいいかもです。
最終的にこんな感じになりました。
docker run -it --rm \
-v "$(pwd)":/workspace \
ubuntu:24.04 \
bash -c "cd /workspace && scriptreplay -m 0.01 timing-[時間].log session-[時間].log"
まとめ
- Docker + scriptコマンドを使うと、ホストを汚さずにターミナル作業のログを残せる
-
-f
オプションでリアルタイム記録できる -
-T
を付けてtiming
情報も記録しておくと、scriptreplay
で再生できる - 再生が遅いときは
-m 0.01
くらいがちょうどよかった
今のところ、このやり方でうまく動いてます。
Discussion