web-dev-qa-db-ja.com

シェルスクリプトを介してターミナルアプリケーションのスクリーンショットをキャプチャしますか?

問題

iftopを5秒間実行し、スクリーンショットをキャプチャしてファイルに保存します。

iftopは、ネットワークトラフィックを視覚化するための美しいプログラムですが、数秒間実行して出力をファイルにキャプチャできるバッチモードがありません。

だから私の考えは

  • screenなどのコマンドを使用して仮想ディスプレイを作成し、その中でiftopを実行します。
  • screendumpのスクリーンショットを撮るツール(screen)を探します。

これをどうやって使うかについてのアイデアはありますか?

4
Satish

出力が実際にウィンドウにレンダリングされない限り、screenでこれを行うことはできないと思います。これは、おそらくscreenを使用するポイントを無効にします。ただし、ウィンドウはフォアグラウンドである必要はありません。

ImageMagickスイートには、これに使用できるimportというユーティリティが含まれています。 import --helpで「コマンドが見つかりません」と表示された場合は、imagemagickパッケージをインストールすると、すべてのLinuxディストリビューションで利用できるようになります。

importにはウィンドウの名前が必要です。 iftopは端末インターフェースであるため、正しい名前を使用するためには、実行するGUI端末のタイトルを設定する必要があります。その方法は、使用するGUI端末によって異なります。たとえば、私はXFCEターミナルを好みます。

Terminal -T Iftop -e iftop

「Iftop」というタイトルでiftopを実行している新しいターミナルを開きます。そのスクリーンショットを撮ることができます:

import -window Iftop ss.jpg

これを5秒ごとに実行する場合は、代わりにスクリプトを実行しているウィンドウを開いて、同じ端末を再利用できるようにすることをお勧めします。

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を使用していない場合を除いて、このTerminal -T Iftop -e iftopSShot.shを開始します。ほとんどのLinuxGUI端末は特定のDEに関連付けられていますが、それらは独立して使用できるスタンドアロンアプリケーションです。 KDEのデフォルト端末の名前はKonsoleであり、-Tおよび-eの規則に従っていると思います。 GNOMEの場合はおそらくgnome-terminal(これは変更されている可能性があります)であり、-tではなく-Tを使用しているようです。

importはデフォルトでベルを鳴らし、イライラすることに注意してください。ただし、-silentオプションがあります。

1
goldilocks

screenはファイルにログを記録できます:

-Lは、ウィンドウの自動出力ログをオンにするように画面に指示します。

または、現在の画面のコピーをファイルに作成します。

ハードコピー[-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.

1つの画面セッションを実行している場合は、次のコマンドを使用して現在のコンテンツを保存できます。

screen -X hardcopy

100個の個別のファイルに保存する場合、10秒ごとに1つ:

for c in {1..100}; do screen -X hardcopy /my/dir/screen-$c; sleep 10; done
0
mivk

いくつかのアイデア:

  1. この記事のタイトルからこのスクリプトを使用できます: 繰り返しスクリーンショットを撮るためのスクリーンショットツール

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

    2回目に実行すると、使用法がわかります。

    $ ./scrotter 
    Please set server id with --server-id option. # scrotter --server-id <servername>
    

    次に、--server-id blahを使用して実行し、スクリーンショットの撮影を開始します。

    $ ./scrotter --server-id blah
    $ ./scrotter
    

    アクティブなウィンドウのスクリーンショットを撮ります。これは、ループ構造に変更されるか、直接変更されます。

  2. 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
    
0
slm