以静默方式在后台截取屏幕截图以进行存档

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

我使用Ubuntu 18.04 LTS。

有时候如果事情变得非常复杂,我并不总是确定我是如何得到解决方案的,并且为了文档和知识共享的目的,我花了更多的时间来更清楚地了解一个整洁干净的方式, 减少乱码,截取屏幕等等上。

然后我觉得有一个屏幕捕捉工具在背景中默默地每隔30秒拍一张照片会很棒,这样我就可以:

  • 轻松回顾我的步骤,还有陷阱
  • 如果我很幸运,请直接使用此图像存档中的屏幕截图来获取文档。

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

还有更好的想法?

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

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable" 

我刚刚开始学习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编辑器配置了我的默认文件夹,即要保存的图像类型。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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

在此处输入图像描述

我做同样的事情。 这是我写的脚本,名为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 

一些有趣的function:

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

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

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

我想出来了

 #! /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.

由于我有许多Linux发行版,我需要截图,并且他们使用各种窗口管理器,我可能使用最旧的屏幕截图实用程序xwd。 它是XServer发行版的一部分,所以我可以确定每次都安装它。 我不确定它是否已分发,是否适用于Wayland。 命令

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

应该显示根窗口的截图:0.0。 输出文件是特殊格式的转储文件。 ImageMagick可以将该文件转换为更常见的格式。 有关更多信息: https : //linux.die.net/man/1/xwd 。

您可以找到许多想法,如何在其他答案中定期运行此类实用程序。 要在每次执行时输出到不同的文件:

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

我会使用recordmydesktop ,可能具有低fps速率而且没有音频来减少记录的数据量。

虽然这些不完全是截图,但是完整的video,其优点是您可以获得良好的压缩效果,因为只需要保存连续图像之间的差异,您还可以选择录制麦克风,这样您就可以通过说话来记笔记,可以选择将开始/停止按钮添加到系统通知区域。

我能想到的第一件事就是打开一个终端并用它来睡觉一段时间发出scrot。 像这样的东西:

 while sleep 30; do scrot ; done 

对我来说,这里有一个问题。 如果你在30秒的时间间隔内做出重要的事情怎么办? 您是否考虑过屏幕录像机( SimpleScreenRecorder是ubuntu发行版上的一个。我记得另一个名字是伊斯坦布尔

我是如何为自己解决的:

首先,安装以下cronjob:

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

注意DISPLAY=:0语句允许cron访问X Server。

然后,使用以下内容创建~/bin/create-screenshot.sh

 #!/bin/bash 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 
Interesting Posts