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)
我刚刚开始学习 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 设置停止
我做同样的事情。这是我写的脚本,名为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截取屏幕截图。puzzle-diff如果屏幕截图与前一个屏幕截图相同(有一定的容差),它会跳过保存屏幕截图。我使用另一个 shell 脚本screenlog定期调用此脚本:
#! /bin/bash
while true
do
sleep 5
screenlog-capture
done
Run Code Online (Sandbox Code Playgroud)