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

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

質問

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

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

だから私の考えは

  • screen仮想ディスプレイの作成や実行などのコマンドを使用してくださいiftop
  • screendumpスクリーンショットを撮るツール()を見つけますscreen

私は何をすべきか知っていますか?

答え1

出力が実際にウィンドウでレンダリングされない限り、これを行うことはできないと思います。screenこれにより、画面を使用するポイントが失われる可能性があります。しかし、窓が前景にある必要はありません。

これイメージマジシャンこのスイートには、importこの目的に使用できるユーティリティが含まれています。 「コマンドが見つかりません」というメッセージが表示されたら、import --helpimagemagickパッケージをインストールしてください。すべての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 -T Iftop -e iftopSShot.sh。ただし、そうでない場合がありますTerminal。ほとんどのLinux GUI端末は、独立して使用できるスタンドアロンアプリケーションですが、特定のDEに関連付けられています。私はKDEのデフォルトの端末名があると思います。これはGNOMEの場合と規則Konsoleに従い(変更された可能性があります)andを使用していないようです。-T-egnome-terminal-t-T

デフォルトではベルが鳴りますがimport、これは迷惑ですが、オプションがあります-silent

答え2

screenファイルに書き込むことができます:

-Lは、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セッションを実行している場合は、次のコマンドを使用して現在の内容を保存できます。

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をキャプチャする:

これで、正しいタイトルを使用してウィンドウIDを検索し、wmctrlその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

いくつかのアイデア:

  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>
    

    ここでaを使って実行し、--server-id blahスクリーンショットを撮り始めます。

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

    アクティブウィンドウのスクリーンショットを撮ります。これをループ構造に変更するか、自分で修正してみてください!

  2. インポートコマンドを使用してスクリーンショットを撮り、必要に応じて必要なループ(for、whileなど)にラップできます。この記事は、タイムラプス写真のスクリーンショット、必要なすべてがあります。スクリプトが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
    

関連情報