问题
运行iftop
5 秒,捕获屏幕截图并将其保存到文件中。
iftop
是一个用于可视化网络流量的漂亮程序,但它没有批处理模式,我可以运行它几秒钟并将输出捕获到文件中。
所以我的想法是
screen
使用诸如创建虚拟显示器并在其中运行之类的命令iftop
。- 寻找任何工具(
screendump
)来截取屏幕截图screen
。
我知道该怎么做吗?
答案1
我认为除非输出实际上在窗口中呈现,否则您将无法执行此操作,screen
这可能会破坏使用屏幕的意义。但是,窗口不必位于前台。
这图像魔术师套件包含一个名为import
您可以用于此目的的实用程序。如果import --help
出现“找不到命令”,请安装 imagemagick 软件包,它将在任何 Linux 发行版中可用。
import
需要窗口的名称。iftop
是一个终端界面,因此为了确保使用正确的名称,您必须设置它运行的 GUI 终端的标题。具体操作方式取决于您使用的 GUI 终端。例如,我更喜欢 XFCE 终端,它是:
Terminal -T Iftop -e iftop
打开一个iftop
标题为“Iftop”的新终端。可以截取该内容的屏幕截图:
import -window Iftop ss.jpg
如果您打算每五秒执行一次此操作,您可能需要打开运行脚本的窗口,以便可以重用相同的终端:
count=0;
while ((1)); do
iftop &
pid=$!
sleep 1 # make sure iftop is up
count=$(($count+1))
import -window Iftop iftop_sshot$count.jpg
kill $pid
sleep 5
done
如果脚本是“iftopSShot.sh”,那么您将启动它Terminal -T Iftop -e iftopSShot.sh
- 除非您可能没有使用Terminal
.大多数 Linux GUI 终端都与特定的 DE 相关联,尽管它们是可以独立使用的独立应用程序。我相信 KDE 上默认终端的名称是Konsole
,它遵循-T
和-e
约定;对于 GNOME 来说,它可能是gnome-terminal
(这可能已经改变)并且它似乎使用-t
and not -T
。
请注意import
默认情况下会响铃,这会让人恼火,但有一个-silent
选项。
答案2
screen
可以记录到文件:
-L 告诉 screen 打开 Windows 的自动输出日志记录。
或将当前屏幕复制到文件中:
硬拷贝 [-h] [文件]
Writes out the currently displayed image to the file file, or, if no filename is specified, to hardcopy.n in the default directory, where n is the number of the current window. This either appends or overwrites the file if it exists. See below. If the option -h is specified, dump also the contents of the scrollback buffer.
如果您正在运行一个屏幕会话,则可以使用以下命令保存其当前内容:
screen -X hardcopy
要保存到 100 个单独的文件,每 10 秒 1 个:
for c in {1..100}; do screen -X hardcopy /my/dir/screen-$c; sleep 10; done
答案3
在一个X环境:
动态设置终端标题:
在我们的脚本中,有一种使用 ansi 序列更改终端标题的方法:
echo -e "\033]0;Term | myApp\007";
通过窗口标题捕获 png:
现在我们可以使用确切的标题搜索窗口 idwmctrl
并将该 id 传递给import
实用程序:
import -window $(wmctrl -l | grep -i 'Term | myApp' | awk '{print $1}') ~/Pictures/capture.png
构建一个 gif:
convert
调整的示例是,每秒捕获 5 次捕获,然后使用2 秒无限循环将它们转换为 gif 。
rm -f /tmp/*png && for i in {1..5}; do import -window $(wmctrl -l | grep -i 'Term | myApp' | awk '{print $1}') /tmp/$i.png && sleep 1; done && convert -delay 200 -loop 0 /tmp/*.png animation.gif
答案4
几个想法:
您可以使用这篇文章中的脚本,标题为:重复截图的截图工具。
#!/bin/bash # Screenshot tool for TIMS. # # ------------------------- # # By regj 2012.05 # # ------------------------- # # Check for config file create if needed with sane defaults then exit. if [ ! -f $HOME/.scrotter ]; then echo "Creating scrotter config file ${HOME}/.scrotter" echo "scrotfldrbase=${HOME}/Desktop/scrots" > $HOME/.scrotter echo "fontsize=14" >> $HOME/.scrotter echo "fillcolor=white" >> $HOME/.scrotter echo "whiteterm=yes" >> $HOME/.scrotter echo "subw=130" >> $HOME/.scrotter echo "subh=5" >> $HOME/.scrotter echo "fontpath=/usr/share/fonts/dejavu/DejaVuSansMono.ttf" >> $HOME/.scrotter if [ $? = 0 ] ; then echo -e "Config file succesfully created. Adjust values if needed in ~/.scrotter.\nIf you use a black term background set whiteterm to no." echo "Current values:" cat $HOME/.scrotter echo "Rerun scrotter with --server-id if initial run" exit 0 else echo "Something went wrong" exit 1 fi fi # Source config file source $HOME/.scrotter # convert functions for white or black terminal conv_black () { convert -pointsize $fontsize \ -font $fontpath \ -fill $fillcolor \ -draw "text ${xyplace} \"$(date "+%Y.%m.%d %H:%M"|sed -e ' s/\"/\\\"/g' )\"" \ $scrotfldr/$srvid-$count.png $scrotfldr/$srvid-$count.png } conv_white () { convert -pointsize $fontsize \ -font $fontpath \ -fill $fillcolor \ -stroke black \ -strokewidth 1 \ -draw "text ${xyplace} \"$(date "+%Y.%m.%d %H:%M"|sed -e ' s/\"/\\\"/g' )\"" \ $scrotfldr/$srvid-$count.png $scrotfldr/$srvid-$count.png } # Options case $1 in --server-id) echo "Setting srvid" ; echo $2 > /tmp/${USER}-scrot-srvid ; exit 0;; --reset-count) echo "0" > /tmp/$USER-scrot-count ; exit 0;; --clean-up) rm -f $scrotfldr/*.png ; rm -f /tmp/${USER}-scrot-* ; exit 0 ;; --help) echo "Options are: --server-id: Set servername used in test. --reset-count: Reset counter for enumerating png's. --clean-up: Delete png's in current serverfolder and reset counters and serverid. --help: This info." exit 0;; # Uncomment below if you want to remove everything in your scrot folder with this script #--clean-all) if [ -z $scrotfldrbase ]; then # echo "Exiting .." ; exit 1 # fi # echo "NB: $scrotfldrbase will be removed recursively!" # rm -rI $scrotfldrbase/* # rm -f /tmp/${USER}-scrot-* # exit 0 ;; esac # Check if serverid is defined, use if yes if [ -s /tmp/${USER}-scrot-srvid ]; then srvid=$(cat /tmp/${USER}-scrot-srvid) scrotfldr=$HOME/Desktop/scrots/$srvid else echo "Please set server id with --server-id option. # scrotter --server-id <servername>" exit 1 fi # Check if root, exit if yes. if [ $(id -u) = 0 ]; then echo "Do not run as root!" exit 1 fi # Create count file if [ ! -f /tmp/${USER}-scrot-count ]; then echo "0" > /tmp/$USER-scrot-count fi # Create Screenshot folder if not present if [ ! -d $scrotfldr ]; then mkdir -p $scrotfldr fi # Get active window ID activewin=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | grep "window id" ) activewinid=${activewin:40} # Get geometry of window geowinw=$(xwininfo -id ${activewinid} | awk '/Width/ {print $2}') geowinh=$(xwininfo -id ${activewinid} | awk '/Height/ {print $2}') # Define X,Y placment of date text xyplace="$(($geowinw - $subw)),$(($geowinh - $subh))" # Get current count count=$(cat /tmp/${USER}-scrot-count) # Take screenshot import -window "$activewinid" $scrotfldr/$srvid-$count.png # Insert date stamp into screenshot use xyplace variable to adjust placement if [ $whiteterm = yes ] ; then conv_white else conv_black fi # Increment counter echo $(($count+1)) > /tmp/$USER-scrot-count
将以上内容放入名为 的文件中
scrotter
并使其可执行。当你第一次运行它时:$ ./scotter Creating scrotter config file /home/saml/.scrotter Config file succesfully created. Adjust values if needed in ~/.scrotter. If you use a black term background set whiteterm to no. Current values: scrotfldrbase=/home/saml/Desktop/scrots fontsize=14 fillcolor=white whiteterm=yes subw=130 subh=5 fontpath=/usr/share/fonts/dejavu/DejaVuSansMono.ttf Rerun scrotter with --server-id if initial run
第二次运行它,您将得到用法:
$ ./scrotter Please set server id with --server-id option. # scrotter --server-id <servername>
现在使用 a 运行它
--server-id blah
,并开始截图:$ ./scrotter --server-id blah $ ./scrotter
它将截取活动窗口的屏幕截图。这个就修改成循环结构或者直接修改!
您可以使用 import 命令截取屏幕截图,然后根据您的需要将其包装在您喜欢的任何类型的循环中(for、whilte 等)。这篇文章,延时摄影截图,拥有您需要的一切,我认为您不想让脚本从 cron 运行,但其他所有内容似乎都适用。
例如:
# takes screenshot $ import -window root -display :0 -crop 958x490+20+128 "savedfiles/screenshot_$(date +%d%m%y-%H.%M).png" # makes a video out of a bunch of them $ mencoder "mf://screamshots/*.png" -mf fps=10 -o test.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800