以静默方式在后台截取屏幕截图以用于存档目的

J. *_*Doe 5 capture shutter snapshot scrot-command

在我的工作中,我经常尝试不同复杂度的工具并开发使用和集成场景。

我使用 Ubuntu 18.04 LTS。

有时,如果事情变得非常复杂,我并不总是确定我究竟是如何找到解决方案的,并且出于文档和知识共享的目的,我会花费更多时间来更加了解一种整洁干净的方式,减少乱七八糟的事情,截取屏幕截图等等在。

然后我想如果有一个屏幕捕获工具可以在后台每 30 秒无声地拍照这样我就可以:

  • 轻松回顾我的步骤和陷阱
  • 如果幸运的话,可以直接使用此图像存档中的屏幕截图作为文档。

例如,我以为我会为快门配置一个 cronjob,但是当我已经在使用它时,出现一个错误“你已经运行了快门实例”。我现在会用scrot试试。

有什么更好的想法吗?

更新:对于 Cron 托管执行,由于此工具无法解决少于一分钟的时间间隔,这里每 30 秒提供一个解决方案(线程中评分较低的答案)。

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
Run Code Online (Sandbox Code Playgroud)

UnK*_*OWn 8

我刚刚开始学习 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
Run Code Online (Sandbox Code Playgroud)

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

当我启动系统并希望每 10 秒开始屏幕捕获时,

我运行这个命令

sudo watch -n 10 ScreenShot.sh

我已经配置了我的默认文件夹,要保存的图像类型,在gnome-screenshot部分中使用 dconf 编辑器。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

声音被声音部分下的 dconf 设置停止

在此处输入图片说明


Zol*_*tan 5

我做同样的事情。这是我写的脚本,名为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
Run Code Online (Sandbox Code Playgroud)

一些有趣的功能:

  • 它用于scrot截取屏幕截图。
  • 它在文件名中包含当前窗口的名称,使查找更容易。
  • 如果屏幕保护程序正在运行,它不会运行(这是 Cinnamon 特定的,其他桌面将需要不同的命令来检查屏幕保护程序状态)。
  • 它过滤掉了一些我不想截图的应用程序,这个列表可以很容易地扩展。
  • 如果磁盘使用率超过 98%,它将停止截取屏幕截图。
  • puzzle-diff如果屏幕截图与前一个屏幕截图相同(有一定的容差),它会跳过保存屏幕截图。
  • 它从根本上降低了屏幕截图的颜色深度(甚至使它们变成灰度,具体取决于大小)以节省磁盘空间。
  • 我使用 RAM 磁盘作为中间存储(在决定是否保留图像之前),但您也可以使用常规 /tmp 位置。

我使用另一个 shell 脚本screenlog定期调用此脚本:

#! /bin/bash
while true
do
  sleep 5
  screenlog-capture
done
Run Code Online (Sandbox Code Playgroud)