5

継続的に更新されるデータ ファイルがあります。Gnuplot を使用して、最新の 100 データ ポイントのウィンドウを使用して、更新データ ファイルを動的にプロットしたいと考えています。

出来ますか?もしそうなら、いくつかの指針をいただければ幸いです。

4

3 に答える 3

4

Gnuplot といくつかの bash スクリプトを使用して実現できる 1 つの方法を次に示します。

# An updating data file
while :; do echo $((RANDOM%100)); sleep .1; done > datafile

plot コマンドで Gnuplot を初期化し、replot から他の更新を取得します。

(
  echo "plot [0:100] [0:100] '< tail -n100 datafile' with lines";
  while :; do sleep .4; echo replot; done
) | gnuplot -persist

これにより、Gnuplot はtail -n100 datafile0.4 秒ごとに評価し、結果をデータセットとして使用します。tail コマンドは、 の最後の 100 行を返しますdatafile

于 2012-12-06T21:42:29.030 に答える
2

を使用した動的プロット:

最後の値は 100 個のみ

gnuplotスクリプトによる (クイック デモ)

次の 2 つのコマンドを試してみてください。

.1 バックグラウンドでの動的データファイルへの移入

ping -i.2 google.com |
    sed -ue 's/.*seq=\([0-9]\+\) .*time=\([0-9.]\+\) .*/\1 \2/p;d' > file.dat &

.2 インライン スクリプトで gnuplot を実行します (自由に ;- に置き換えMAX=40MAX=100ください)

MAX=40
gnuplot -e "while(1){pause 0.1;stats 'file.dat' u 0 nooutput;
    lPnts=STATS_records<$MAX?0: STATS_records-$MAX;
    plot 'file.dat' using 1:2 skip lPnts title 'google' w st  }"

Ctrl+Cを押して gnuplot を終了し、次に kill %%実行を停止する必要がありますping

bashスクリプト

最後の 100 個の値のみを保持するデータ ファイルを維持する小さなこれは単純にカウンターを使用し、カウンターが制限に達したらデータ ファイルの最初の値を削除します。

#!/bin/bash

declare TMPDIR=/tmp DEST=${1:-google.com} DELAY=${2:-.25} MAXDATA=100
[ -d /dev/shm ] && [ -w /dev/shm ] && TMPDIR=/dev/shm
read -r TMPDAT < <(mktemp -p "$TMPDIR" --suffix .dat plot-XXXXXXXXXX)

exec {PFD}> >(exec gnuplot)
closExit() { exec {PFD}>&- ; [ -f "$TMPDAT" ] && rm "$TMPDAT" ; exit ;}
trap closExit 0 1 2 3 6 15

getDatas() {
    read -r data < <(
        ping -c 1 -n "$DEST" 2>&1 |
            sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d'
    )
    now=$EPOCHREALTIME
    printf '%.6f %s\n' >>"$TMPDAT" "$now" "$data"
    (( cnt++ > MAXDATA )) && sed -e 1d -i "$TMPDAT"
    printf ' %8d %(%a %b %d %T)T.%s %s\n' \
            "$cnt" "${now%.*}" "${now#*.}" "$data"
}
getDatas

echo >&$PFD "set term wxt noraise persist title 'Ping $DEST';"
echo >&$PFD "set xdata time;"
echo >&$PFD "set timefmt '%s';"

while ! read -rsn 1 -t "$DELAY" ;do
    getDatas
    echo >&$PFD "plot '$TMPDAT' using 1:2 with line title 'ping $DEST';"
done

サンプルの実行 (約 x15 のアニメーション GIF を加速):

Ping グラフのサンプル

マルチプロセスのデモ スクリプト

私は、gnuplot を動的に実行できるマルチピングbash スクリプトを作成しました (そして、多くのバックグラウンド タスクに同時に ping を実行できます)。

このスクリプトでは、最後の N 番目の値に制限はありませんでしたが、このスクリプトは、多くの異なるストリームからデータを読み取る方法を示し、対話性のためにSTDIOを維持し、サブプロセスへのプロットのアップグレードを注文するために別のストリームに対処します。gnuplot

次のように実行できます。

multiping.sh -pci .3 www.google.com www.stackexchange.com

そこでの目標は、入力および/または出力のために、さまざまなサブプロセスを管理するインタラクティブな

コマンド

実行中は、次の操作を行うことができます。

  • q終了する (すべての FD を閉じ、すべてのサブプロセスを終了する)
  • pgnuplot新しいサブプロセスを使用してプロットを開始するには
  • sプロットを停止するには
  • rコンソール端末をリセットする
  • hコンソール端末にヘッダー行を出力する

使用法

コマンド ライン-hスイッチが表示され、次にヘルプが表示されます。

Usage: multiping.sh [-[cdhp]] [-i N] <host or ip> [host or ip] [host or ip]...
  Options:
    -c      colors (red for no answer, green for higher "seq" number)
    -d      Debug this (by opening 2 xterm windows... look at script)
    -h      help (print this)
    -iN     Interval for ping command (min 0.2 in user mode)
    -p      Plot dynamically (require gnuplot)
    All following argument will be "target" for "ping" command.
于 2021-04-01T17:10:40.107 に答える