web-dev-qa-db-ja.com

アーカイブ目的でバックグラウンドで静かにスクリーンショットを撮ります

作業中、私はしばしば異なる複雑さのツールを試し、使用と統合のシナリオを開発します。

Ubuntu 18.04 LTSを使用しています。

物事が本当に複雑になった場合、ソリューションにどれだけ正確に到達したかが常にわからないことがあります。ドキュメントや知識の共有のために、[lessいじって、スクリーンショットを撮るなど。

それから、30秒ごとに写真を撮るスクリーンキャプチャツールがあればいいと思いましたサイレントモードで

  • 手順を簡単にまとめ、また落とし穴も簡単に
  • 運が良ければ、この画像アーカイブのスクリーンショットをドキュメントに直接使用してください。

たとえば、シャッター用のcronjobを設定すると思いましたが、すでに使用しているときに、「すでにシャッターインスタンスを実行しています」というエラーがあります。今からscrotで試してみます。

より良いアイデアはありますか?

UPDATE:Cron管理実行の場合、このツールは1分未満の時間間隔を解決できないため、ここでは ソリューション (スレッド内の低い評価の回答の)30秒ごと。

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
4
J. Doe

Ubuntuの学習を始めました。
この方法が適切かどうかわかりません。
以下の方法で達成できました。

/ usr/local/binフォルダーにScreenShot.shという名前のスクリプトを作成しました

#!/bin/bash

# NAME: ScreenShot.sh
# PATH: /usr/local/bin
# DESC: Take Screenshots at every specified intervals with "watch -n 10 ScreenShot.sh" Command
# DATE: Oct 12th 2018

Sudo gnome-screenshot -d 0

Sudo chmod a+x /usr/local/bin/ScreenShot.sh

システムを起動し、10秒ごとに画面キャプチャを開始したい場合、

このコマンドを実行します

Sudo watch -n 10 ScreenShot.sh

gnome-screenshotセクションにdconfエディターを使用して、保存するイメージタイプをデフォルトフォルダーに設定しました。

enter image description here

enter image description here

enter image description here

サウンドは、サウンドセクションのdconf設定によって停止されます

enter image description here

8
PRATAP

私も同じことをします。これは、私が書いたscreenlog-captureというスクリプトです:

#! /bin/bash
window_name() {
  xwininfo -id "$1" | \
    grep "^xwininfo: Window id" | \
    LC_CTYPE=C LC_COLLATE=C sed  's/^[^"]*"\(.*\)"$/\1/' | \
    sanitize-filename
}

window_class() {
  xprop -id "$1" | grep "^WM_CLASS(STRING)" | cut -d '"' -f 4
  # Or we could use _NET_WM_PID(CARDINAL) -> process name
}

if [ ! -d "$RAMTMP" ]
then
  echo "RAMTMP needs to be set."
  exit 1
fi
if [ ! -e /usr/bin/puzzle-diff ]
then
    echo 'Error: puzzle-diff not installed!'
    exit 1
fi

rootdir="$HOME/screenlog"
if [ ! -w "$rootdir" ]
then
  echo 'Error: screenlog dir not writable'
  exit 1
fi
if [[ $(qdbus org.cinnamon.ScreenSaver /org/cinnamon/ScreenSaver org.cinnamon.ScreenSaver.GetActive) == true ]]
then
  exit
fi
du=$(df -Plh "$rootdir" | sed -n -e '2s/.* \([0-9]\+\)% .*/\1/' -e '2p')
if [ "$du" -ge 98 ]
then
  exit
fi
win_id=$(xprop -root | grep "^_NET_ACTIVE_WINDOW(WINDOW)" | cut -d ' ' -f 5)
win_name=$(window_name "$win_id")
parent_id=$(xprop -id "$win_id" | grep "^WM_TRANSIENT_FOR(WINDOW)" | cut -d ' ' -f 5)
if [ "$parent_id" ]
then
  win_class=$(window_class "$parent_id")
else
  win_class=$(window_class "$win_id")
fi
case "$win_class" in
  # Firefox-bin is full-screen YouTube video (for example)
  Gq|Geeqie|GQview|Firefox-bin|Plugin-container|Gimp|mplayer2)
    exit
    ;;
esac
case "$win_name" in
  *'Internet Bank'*|*'YouTube'*|MPlayer|Netflix*|Prime\ Video*)
    exit
    ;;
esac

tmpfilename="$RAMTMP/screenlog-capture.png"
scrot -buq 0 "$tmpfilename"
if [ ! -s "$tmpfilename" ]
then
  exit
fi
if [ $(stat -c %s "$tmpfilename") -lt 500000 ]
then
  mogrify -depth 3 "$tmpfilename"
else
  mogrify -type Grayscale -depth 3 "$tmpfilename"
fi
latest="$rootdir/latest.png"
puzzle-diff -c -e -E 0.1 "$latest" "$tmpfilename" &>/dev/null
if [ $? -eq 10 ]
then
  # No relevant changes, don't keep screenshot
  rm "$tmpfilename"
else
  win_name="$(printf %.30s $win_class) - $(printf %.60s $win_name)"
  date=$(date '+%Y-%m/%Y-%m-%d')
  dirname="$rootdir/$date"
  mkdir -p "$dirname"
  filename="$dirname/$(date '+%H.%M.%S') $win_name.png"
  mv "$tmpfilename" "$filename"
  rm -f "$latest"
  ln -s "$filename" "$latest"
fi

興味深い機能のいくつか:

  • scrotを使用してスクリーンショットを撮ります。
  • ファイル名に現在のウィンドウの名前が含まれているため、検索が容易になります。
  • スクリーンセーバーが実行されている場合は実行されません(これはCinnamon固有です。他のデスクトップでは、スクリーンセーバーの状態を確認するために別のコマンドが必要です)。
  • スクリーンショットを撮りたくないアプリケーションを除外します。このリストは簡単に拡張できます。
  • ディスク使用量が98%を超えると、スクリーンショットの撮影が停止します。
  • puzzle-diffを使用して、スクリーンショットの保存が以前のものと同じ場合(ある程度の許容差はある)、保存をスキップします。
  • スクリーンショットの色深度を根本的に減らし(またはサイズに応じてグレースケールにします)、ディスク容量を節約します。
  • 中間ストレージにRAMディスクを使用します(イメージを保持するかどうかを決定する前に)が、通常の/ tmpの場所も使用できます。

別のシェルスクリプトscreenlogを使用して、これを定期的に呼び出します。

#! /bin/bash
while true
do
  sleep 5
  screenlog-capture
done
4
Zoltan

思いついた

#! /usr/bin/env bash

sleep_period=30s

while true; do

scrot $HOME/Pictures/"$(date +%Y%m%d%H%M%S)".png

sleep ${sleep_period}
done

~/binがあるので、このスクリプトをcontinuous-scrot.shとして保存し、実行可能にしました。実行するには、ターミナルウィンドウを開いてスクリプトの名前を入力し、 Enter。このターミナルウィンドウをアクティブのままにして、フルスクリーンのスクリーンショットが~/Picturesフォルダーに30秒ごとにキャプチャされます。停止するには、このターミナルウィンドウに戻り、 Ctrl+C

2
DK Bose

スクリーンショットが必要なLinuxディストリビューションが多数あり、さまざまなウィンドウマネージャーを使用しているため、おそらく最も古いスクリーンショットユーティリティxwdを使用します。これはXServerディストリビューションの一部であるため、毎回確実にインストールされます。それが配布されているかどうか、そしてウェイランドで動作するかどうかはわかりません。コマンド

xwd -display :0.0 -root -out screenshot.xwd

display:0.0のルートウィンドウのスクリーンショットを作成する必要があります。出力ファイルは、特別な形式のダンプファイルです。 ImageMagickは、そのファイルをより一般的な形式に変換できます。詳細: https://linux.die.net/man/1/xwd

他の回答では、このようなユーティリティを定期的に実行する方法について多くのアイデアを見つけることができます。できるたびに異なるファイルに出力するには:

xwd -display :0.0 -root -out "$(date).xwd"
1
nobody

記録されたデータの量を減らすために、おそらく低fpsレートで音声なしのrecordmydesktopを使用します。

これらは正確なスクリーンショットではなく、完全なビデオですが、利点は、連続する画像間の違いのみを保存する必要があるため、優れた圧縮が得られることです。オプションで、システム通知領域に開始/停止ボタンを追加できます。

1
Simon Richter

私が自分でこれをどのように解決したか:

まず、次のcronjobをインストールします。

* * * * * DISPLAY=:0 /usr/bin/Sudo -i -u <USER> bash -c '/home/<USER>/bin/create-screenshot.sh; sleep 30; /home/<USER>/bin/create-screenshot.sh;'

DISPLAY=:0ステートメントに注目して、cronがXサーバーにアクセスできるようにします。

次に、次の内容で~/bin/create-screenshot.shを作成します。

#!/bin/bash

user="<USER>"
folder="$(date +%Y%m%d)"
y="$(date +%Y)"
m="$(date +%m)"

mkdir -p "/home/$user/screenshots/$y/$m/$folder"
file="$(date +%Y%m%d%H%M%S)".png
path="/home/$user/screenshots/$y/$m/$folder/$file"
scrot $path
0
J. Doe

私が最初に考えることができるのは、ターミナルを開いて、スリープ状態でしばらくしてからscrotを発行することです。このようなもの:

while sleep 30; do scrot <whatever>; done

私には、これには問題があります。 30秒の間隔の間に何か重要なものを作成するとどうなりますか?スクリーンレコーダーを検討したことがありますか(SimpleScreenRecorderはUbuntuディストリビューションで利用可能なものです。別の名前はIstanbul))

0
Gianlucawork