業務でデータ移行に伴うコマンドを本番環境で実行する場面があり、そのときに先輩から「本番作業ではこうやる」という流儀として 2 つのコマンドを教わりました。script と tar です。
正直なところ、script というコマンドの存在自体を知らず、tar も「.tar.gz を解凍するときに使うやつ」というイメージしかありませんでした。ただ、教わってみていちばん大きな気づきだったのは個別コマンドそのものではなく、本番で何かを触る前に 証拠を残す / 現状を退避しておく という発想がそもそも自分の中になかった、ということでした。
教わったままだと忘れてしまいそうなので、書き残しておきます。
作法1:本番で打ったコマンドは記録しておく
なぜ記録するのかというと、本番作業では「自分が何をやったか」をあとから第三者が確認できる状態にしておく必要があるからです。
- 何のコマンドを、どの順番で打ったかを、ターミナルのスクロールバックではなく「ファイル」として残せる
- 障害が起きたときに「どのコマンドのあとから挙動が変わったか」を時系列で追える
- 引き継ぎや報告のときに、ログそのものを共有できる
これを実現するのが script コマンドです。ターミナルでのやり取り(入力したコマンドとその出力)を丸ごとファイルに記録してくれます。history のような「打ったコマンドの一覧」ではなく、画面に出ていたものごと録画している、というイメージのほうが近いです。
最小限の使い方は次のとおりです。
# 記録開始(session.logファイル に書き出す)
script session.log
# ここで普通にコマンドを打つ
ls -la
cat /etc/hostname
# 記録終了
exit
exit を打つと記録が止まり、session.log に入力と出力の両方が残ります。
また、すでにあるファイルに追記したい場合は script -a session.log のように -a を付ければ既存ファイルの末尾に書き足してくれます。
最初に「録画される」と聞いたときは何が嬉しいのかピンと来なかったのですが、本番作業の後で「あのとき何のコマンド打った?」と聞かれる場面を想像すると、一気に納得感が出てきました。
実際に動かしてみる
最小例は分かっても、手を動かさないと体感がないので、自分が試した手順をそのまま書いておきます。ログ置き場として、ホームディレクトリの下に qiita/tmp/ というフォルダを作っておきます。
作業ディレクトリにログファイルが散らからずに済みますし、後で ls -ltr でまとめて確認しやすくなります。
# ログ置き場を用意(ホーム直下の qiita/tmp に置く)
mkdir -p ~/qiita/tmp
# 日時と作業対象を入れた名前で記録開始
script ~/qiita/tmp/$(date '+%Y%m%d_%H%M%S')_qiita-articles_test.log
$(date '+%Y%m%d_%H%M%S') の部分は、コマンドを打った瞬間の日時(例:20260516_070629)に展開されます。これでログファイル名にいちいち日付を手で打たなくても、毎回ユニークな名前で記録が始まります。
この状態でターミナル上での操作はすべて記録されます。
# 中で普通にコマンドを打つ(例)
pwd
ls -la
whoami
# 記録終了
exit
exit で記録が止まります。
ファイルが本当にできているか、tmp/ に移動して確認します。
# tmp フォルダに移動して中身を見る
cd ~/qiita/tmp/
ls -ltr
# 生成されたlogファイル
-rw-r--r-- 1 goro staff 4685 5月 16 07:07 20260516_070629_qiita-articles_test.log
# ログファイルの中身を確認(カレントが ~/qiita/tmp/ なのでファイル名だけで OK)
less -r 20260516_070629_qiita-articles_test.log
-ltr は更新時刻の昇順(古い順)で並べるオプションです。新しく作ったログが一番下に出てくれるので、複数のログが溜まっても見つけやすくなります。一覧に先ほど打った日時のファイルが並んでいれば、記録は無事に残せています。
中身を確認するときは、ls -ltr で見えたファイル名を使って less で開きます。
-r は制御文字(カラー表示などの ANSI エスケープ)を素のまま通すオプションです。これを付けないとプロンプトの色付け部分が ^[[01;32m のような文字列で表示されてしまい、ログがとても読みにくくなります。
ファイルを開くと、最初に Script started on ...、最後に Script done on ... という行が自動で入っています。script が自分で挿入するメタ情報なので、自分が打った覚えがなくても驚かなくて大丈夫です。
ファイル名に日時と作業対象を入れているのは、同じ tmp/ に複数のログが溜まっていったときに「いつ・何の作業のログか」をファイル名だけで判別できるようにするためです。本番作業を複数日にわたって繰り返す場面では、この命名規則のありがたみがじわじわ効いてきます。
作法2:触る前に現状を退避しておく
もう 1 つの作法は、本番で何かを触る前に、その現状をコピーして退避させておくことです。
- 本番で何かを壊してしまったあと、手で元の状態に戻すのは現実的ではない
- 事前にコピーを取っておく、という備えだけが「壊しても戻せる」状態を作る
- データ移行のように「ファイルやディレクトリの中身が変わる作業」では、退避があるかどうかで安心感がまったく違う
ここで使うのが tar です。
tar については、それまで「.tar.gz を解凍するときに使うやつ」というイメージしか持っておらず、自分の中では完全に「受け取る側のコマンド」でした。けれど本来の tar は ディレクトリを丸ごと 1 つのアーカイブにまとめる ためのコマンドで、退避用途にちょうど良い道具です。
最小限の使い方は次の 2 つです。固めるときと、戻すときです。
# target_dir をまるごと固めて backup.tar.gz を作る
tar czvf backup.tar.gz ./target_dir
# 戻すとき(カレントディレクトリに展開される)
tar xzvf backup.tar.gz
czvf / xzvf の各文字の意味は次のとおりです。
-
c: アーカイブを新規作成(create) -
x: アーカイブを展開(extract) -
z: gzip で圧縮/解凍する -
v: 処理中のファイル名を表示(verbose) -
f: 続けて入出力ファイル名を指定(file)
czvf と xzvf を見比べると違うのは最初の 1 文字だけで、固めるときは c、戻すときは x に入れ替えるだけです。
残りの z / v / f は固める側でも戻す側でも同じ、と覚えておくと混乱しません。
実際に動かしてみる
ここでは試しに ~/qiita フォルダ自体をまるごと固めてみます。
退避ファイルの 置き場所 には注意が必要です。~/qiita/tmp/ の中など、固める対象(~/qiita)の 内側 にアーカイブを置こうとすると、tar が自分自身を巻き込みながらアーカイブを作ろうとして、警告が出たり壊れたアーカイブができたりします。今回はホーム直下(~/)に置きます。
# ~/qiita を丸ごと固めて、ホーム直下に日時付きで置く
tar czvf ~/qiita_backup_$(date '+%Y%m%d_%H%M%S').tar.gz -C ~ qiita
-C ~ は「ホームに移動してからアーカイブ作業を開始する」という指定です。これでアーカイブ内のパスが qiita/... という相対パスになり、後で展開するときに好きな場所に戻せます。v を付けているので、固める対象のファイル名が画面に流れていき、何が入ったかをその場で目視できます。
固められたか、ホームディレクトリに移動して ls -ltr で確認します。
# ホームに移動
cd
# 更新時刻の昇順で並べる(最新のファイルが一番下に出る)
ls -ltr
一覧の一番下に、作ったばかりのバックアップが日時付きで見えていれば成功です。
-rw-r--r-- 1 goro staff 4283302 5月 17 06:49 qiita_backup_20260517_064858.tar.gz
戻すときは、-C ~ でホームに展開すれば、アーカイブの中の qiita/... がそのまま ~/qiita/... に戻ります。
# ~/qiita に戻す
tar xzvf ~/qiita_backup_20260517_064858.tar.gz -C ~
ただし、現在の ~/qiita がまだ残っている状態でそのまま展開すると、ファイルが上書きで混在 することに注意が必要です。アーカイブと現状の両方にあるファイルはアーカイブの中身で上書きされ、現状にしか無いファイルはそのまま残ります。バックアップ時点の状態に丸ごとリセットしたい場合は、いきなり展開せずに、いったん現状をリネームして退避してから展開するほうが安全です。
# 現状の ~/qiita を一旦リネームしておく(消すのはまだ怖いので退避)
mv ~/qiita ~/qiita_old_$(date '+%Y%m%d_%H%M%S')
# クリーンな ~ にアーカイブを展開
tar xzvf ~/qiita_backup_20260517_064858.tar.gz -C ~
# 中身を確認して、問題なければ旧フォルダを削除
ls ~/qiita
# rm -rf ~/qiita_old_XXXXXXXX_XXXXXX
「いきなり消さずに、リネームで退避してから差を確認する」という一手間で、戻し失敗時にもう一度やり直す余地を残せます。
データ移行の前にディレクトリを丸ごと固めておけば、移行中に何かおかしくなっても元のディレクトリ状態に戻せます。本番作業に入る前のこの一手間が、作業中の判断のしやすさに直接効いてくる感覚がありました。
学び:本番作業は「コマンド」より先に「備え」だった
今回いちばん大きかった気づきは、script や tar という個別コマンドを知らなかったこと 以上に、そもそも「本番で記録を残す」「触る前に退避を作る」という発想自体が自分の中になかったことでした。
コマンドはあとから調べれば出てきますが、「本番に入る前にやる備えがある」というメンタルモデルそのものがなかったので、教わって初めて自分の中の地図に追加されたという感覚があります。
これから本番作業に関わる場面が増えても、まず「記録と退避」を意識する起点ができた、というのが今回の素直な学びでした。