📜

Dockerでターミナル操作を記録&再生したくて、scriptとscriptreplayを試してみた

に公開

なにこれ?

普段環境を汚したくないので、Docker内で色々作業をすることが多いのですが、さっき何やったっけ?となってしまうことがありました。
そこで、作業ログを残す方法ないかなと探してみたら、ターミナルログを記録する方法を見つけました。

scriptコマンドを使えば、ターミナルのやりとりをまるっと記録できるらしいです。

今回はUbuntu 24.04のDockerイメージを使って、scriptによる記録をやってみます。

scriptコマンドって何?

scriptは、ターミナル上で行われた操作を入力・出力の両方から記録してくれるコマンドらしいです。

以下のような内容を記録してくれる

  • 実行したコマンド
  • 出力
  • 画面制御文字(色変えとかカーソル移動のやつ)

なので、あとで何をやったっけ?と振り返るときや、検証の手順を残しておきたいときに便利っぽいです。

Ubuntu 24.04のイメージubuntu:24.04には、標準でscriptが入ってるから面倒なセットアップなしで使えていい感じです。

docker runしてみる

下記のコマンドを叩くと、/workspacesession-日付.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