サーバーで複数の操作を重ねていると、「あのコマンドの実行直後に何が表示されたか」「どの手順でエラーが出たか」をあとから確認したくなる場面があります。手元のメモでは抜け漏れが起きやすく、スクリーンショットではテキスト検索ができません。Linuxには端末の入出力をそのままファイルへ書き出す script コマンドが標準で含まれており、追加のインストールなしに利用できます。
scriptコマンドが記録する対象
script は、起動後のシェルセッション全体を記録します。打ち込んだコマンド、その出力、エラーメッセージ、対話式プログラムの表示など、端末画面に現れるものがすべて対象です。色付けやカーソル移動に使われるエスケープシーケンスも含めて記録されるため、読み返したときに当時の表示に近い形を確認できます。
記録中は通常のシェルとまったく同じように操作できます。sudo によるパスワードプロンプトや、ssh で接続先へ移動した後の操作も記録されます。ただし、vim や less といったフルスクリーン型のプログラムは画面描画用のシーケンスが大量に入るため、後述の方法で整形してから読み返すことになります。
記録の開始と終了
引数なしで実行するとカレントディレクトリに typescript というファイルが作られ、記録が始まります。保存先とファイル名を指定したい場合は引数として渡します。日時をファイル名に含めると、後から探しやすくなります。
# 記録開始(保存先とファイル名を指定する例)
script /var/log/work/$(date +%Y%m%d_%H%M%S)_maintenance.log
記録を終了するには exit と入力するか、Ctrl + D を押します。「Script done」というメッセージが表示されれば、元のシェルに戻っています。
exit
# Script done — output file is /var/log/work/20261024_143022_maintenance.log
記録中に端末を閉じた場合でも、ファイルはその時点までの出力を保持しています。「Script done」が出ていなくても、内容は読み返せます。
タイミングファイルを同時に記録する
「どの操作にどれだけ時間がかかったか」を後から確認したい場合は、操作のタイミング情報を別ファイルに保存できます。--log-timing オプションを使う形が現行の util-linux では標準的です。
script \
--log-out /var/log/work/20261024_session.log \
--log-timing /var/log/work/20261024_session.timing
利用環境によってはオプション名が異なる場合があります。script --help で手元の書式を確認できます。古い環境では次の形式が使われることがあります。
# util-linux 2.28 以前など
script -t 2>/var/log/work/20261024_session.timing /var/log/work/20261024_session.log
タイミングファイルがあると、scriptreplay を使って操作を再生できます。実際の操作速度で再生されるため、長い作業を確認するときは倍速オプションと組み合わせると効率的です。
# 3倍速で再生する
scriptreplay \
--timing /var/log/work/20261024_session.timing \
--typescript /var/log/work/20261024_session.log \
--divisor 3
記録ファイルの読み返し方
記録ファイルはテキストファイルなので less や cat で開けます。エスケープシーケンスが含まれていて読みにくい場合は col -b を通してから確認できます。
# エスケープシーケンスを除去してページャで確認
col -b < /var/log/work/20261024_session.log | less
特定のキーワードを探したい場合は grep と組み合わせます。エラーや警告の有無を素早く確認するのに使えます。
# "error" または "Error" を含む行を抽出する
col -b < /var/log/work/20261024_session.log | grep -i error
vim や less を多用した記録では col -b でも整形しきれない場合があります。その場合は strings コマンドで印字可能文字だけを抽出する方法を試せます。
strings /var/log/work/20261024_session.log | less
ログの保存先と権限の整理
保存先ディレクトリをあらかじめ決めておくと、後から日付で絞り込みやすくなります。次は作業ユーザーだけが読み書きできる形でディレクトリを作る例です。
sudo mkdir -p /var/log/work
sudo chown "$(whoami)":"$(whoami)" /var/log/work
sudo chmod 700 /var/log/work
ファイル名に日時が入っていると、find で期間を絞り込めます。
# 直近7日以内の記録ファイルを一覧表示
find /var/log/work -name "*.log" -mtime -7 -type f | sort
記録ファイルにはコマンドの出力がそのまま残るため、環境変数の値や接続情報が含まれることがあります。保存先のアクセス権限は最小限に絞ってください。ファイルが増え続ける場合は logrotate の管理対象に加えると、古いログを定期的に圧縮・削除できます。
よくあるつまずきと対処
記録中にさらに script を起動すると入れ子状態になり、ログが二重に書き出されることがあります。一般的には、環境変数 SCRIPT が設定されている状態(記録中)では再起動を防ぐ制御を入れると安全です。シェルの設定ファイルに関数として書いておく方法があります。
# 多重起動を防ぐ関数の例(.bashrc や .zshrc に追記)
startlog() {
if [ -n "$SCRIPT" ]; then
echo "すでに記録中です: $SCRIPT"
return 1
fi
script /var/log/work/$(date +%Y%m%d_%H%M%S)_session.log
}
また、ssh 接続先で script を使う場合、接続が切れると記録が不完全になる可能性があります。長時間の作業では tmux や screen と組み合わせてセッションを維持した上で記録を取ると、切断による記録の欠損を防ぎやすくなります。
記録を開始したまま作業を続けるうちにファイルが肥大化することがあります。作業単位で開始・終了を区切り、1ファイルが対応する作業範囲を明確にしておくと、後から特定の操作を探すときの手間が減ります。
「コマンドは打てる。次は"現場で通用する型"を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
