暇人の寝室

技術系備忘録のブログ

Linuxで定期的にスクリーンショットを撮る

ひょんなことから自身の作業ログを取ってみたくなったのでスクショを撮って集めてみることにした。

要件

  • pngで取得
  • 10秒毎に1枚撮る
  • 出来るだけ1枚あたりのサイズを軽く
  • ファイル名から日時が分かる

環境

  • Arch Linux
  • Gnome(デスクトップPC)
  • i3(ノートPC)

デスクトップとノートの2つでスクショを撮る

何を使って撮るか

LinuxなのでCLIから実行できるツールが1番手っ取り早い。 ArchのwikiによればImageMagicのimportかxwd辺りが良さげ。

理由は後述するが今回はxwdを使う。

実装

xwdの使い方

xwd -root -out example.xwd

xwdは-rootオプションを付けるとX window systemのルートウィンドウ、つまり画面全体をスクショできる。

ただし、そのまま実行しても標準出力に吐き出されるので-outオプションで出力ファイルを指定する。

pngで保存する

xwdでスクショすると.xwdというフォーマットで出力される。ImageMagicのconvertコマンドでpngに変換する。

xwd -root | convert xwd:- example.png

(余談)importを使う場合

importを使う場合はパイプとか使わずにpngでスクショできる。

import example.png

シェルスクリプトで10秒毎に取得

以下作成したスクリプト

#!/usr/bin/sh

LOG_ROOT="/var/log/hoge"

while true
do
TIME=`date "+/%m/%d/%H/%M/"`

LOG_DIR=${LOG_ROOT}${TIME}

if [ ! -e ${LOG_DIR} ]; then
    mkdir -p ${LOG_DIR}
fi

xwd -root | convert xwd:- "${LOG_DIR}`date "+%S"`.png"
sleep 10
done

xwdを用いた理由

importの方が手軽なのになぜ使わなかったか。 理由は単純で、1枚あたりの画像容量がxwd&convertよりも大きかったから。 xwd&importが200~300KBなのに対し、importは400KBを超えていた。 何千枚も撮るので容量は抑えたかったためxwdを使う方法を採用した。