如何在运行时使用 Bash 中的变量在 RRDTool 中插入 VRULE

如何在运行时使用 Bash 中的变量在 RRDTool 中插入 VRULE

我使用超棒的 RRDTool 应用程序成功生成了许多图表。但是,我在绘制图表时遇到了一些 VRULE 选项问题。

我正在使用 Bash 脚本生成图表。现在我试图在午夜(UTC+02:00)绘制一条垂直红线。

获取纪元最后 2 个午夜时间的代码:

NOW=`date +%s`
DAY=86400
ZONE=7200
LDAY=$((NOW/DAY))
MID=$((LDAY*DAY))
SAST=$((MID-ZONE))
YEST=$((SAST-DAY))

因此,如果我echo选择$SAST$YEST,它就会给我昨晚午夜或前一天的纪元时间。

以下是(其中一个)图表的工作片段:

$RRDTOOL graph /var/www/images/graphs/wdata36h.png                      \
--title 'Pi Traffic Count (wlan0)'                                      \
--watermark "Graph Drawn `date`"                                        \
--vertical-label 'Bytes'                                                \
--lower-limit '0'                                                       \
--rigid                                                                 \
--alt-autoscale                                                         \
--units=si                                                              \
--width '700'                                                           \
--height '200'                                                          \
--full-size-mode                                                        \
--start end-36h                                                         \
'DEF:wrx=/usr/local/bin/system/data.rrd:wrx:AVERAGE'                    \
'DEF:wtx=/usr/local/bin/system/data.rrd:wtx:AVERAGE'                    \
'AREA:wtx#0000FFFF:Upload\:'                                            \
'GPRINT:wtx:LAST:\:%8.2lf %s]'                                          \
'STACK:wrx#00CC00FF:Download\:'                                         \
'GPRINT:wrx:LAST:\:%8.2lf %s]'

如您所见,该图表涵盖了过去 36 小时,其中包括 2 个午夜。我尝试过以多种方式添加$SAST和变量,但它一直将它们读取为变量名称,而不是变量值。$YEST

我尝试添加:

'VRULE:$YEST#FF0000' \
'VRULE:$SAST#FF0000' \

'VDEF:yest=$YEST'   \
'VDEF:sast=$SAST'   \
'VRULE:yest#FF0000' \
'VRULE:sast#FF0000' \

但是引号导致变量被解释为变量名。

我真的不想重新创建data.rrd文件,因为里面有很多历史数据。这意味着我需要在舞台上graph而不是update舞台上绘制这些垂直线。

答案1

我试着每 6 小时画一条垂直线,这是我的工作脚本

#!/bin/sh
NOW=`date +%s`
DAY=86400
day6=21600
ZONE=10800
LDAY=$((NOW/DAY))
MID=$((LDAY*DAY))
SAST=$((MID-ZONE))
sa6=$((SAST+day6))
sa12=$((SAST+day6*2))
sa18=$((SAST+day6*3))
#YEST=$((SAST+43200))

bsd="/home/alex112/us/u2"
#dat0=date -u -d $diff" +%-D
rrdtool graph $bsd/temp01.png       \
--watermark "Graph Drawn `date`"   \
 -w 600 -h 220 -v "Temperature"     \
--upper-limit 10 --lower-limit -8   \
  DEF:t11=$bsd/temp.rrd:t1:AVERAGE  \
  DEF:t12=$bsd/temp.rrd:t2:AVERAGE  \
  CDEF:ct11=t11,10,/                \
  CDEF:ct12=t12,10,/                \
  LINE1:ct11#00FF00:"fridge"        \
  LINE1:ct12#0000FF:"stock"         \
  HRULE:0#000000:"Zero Level"      \
  HRULE:8#FF0000:"Max temp"        \
  HRULE:-6#FF0000:"Min Fridge"     \
  VRULE:$SAST#FF0000:   \
  VRULE:$sa6#FF0000:   \
  VRULE:$sa12#FF0000:   \
  VRULE:$sa18#FF0000:"Zero time"

答案2

经过多次反复尝试(下文将详细介绍)

我发现我不能把所有的参数都放在引号中。

我最终得到了这个:

$RRDTOOL graph /var/www/images/graphs/wdata36h.png                      \
--title 'Pi Traffic Count (wlan0)'                                      \
--watermark "Graph Drawn `date`"                                        \
--vertical-label 'Bytes'                                                \
--lower-limit '0'                                                       \
--rigid                                                                 \
--alt-autoscale                                                         \
--units=si                                                              \
--width '700'                                                           \
--height '200'                                                          \
--full-size-mode                                                        \
--start end-36h                                                         \
'DEF:wrx=/usr/local/bin/system/data.rrd:wrx:AVERAGE'                    \
'DEF:wtx=/usr/local/bin/system/data.rrd:wtx:AVERAGE'                    \
'AREA:wtx#0000FFFF:Upload\:'                                            \
'GPRINT:wtx:LAST:\:%8.2lf %s]'                                          \
'STACK:wrx#00CC00FF:Download\:'                                         \
'GPRINT:wrx:LAST:\:%8.2lf %s]'                                          \
VRULE:$YEST#FF0000                                                      \
VRULE:$SAST#FF0000

我尝试将整个连接graph成一个变量,然后运行该变量,但它失败了,因为它删除了单引号,然后认为任何空格都意味着一个新的命令或函数,从而导致错误,如ERROR: 'T' is not a valid function name(从“T”--title'Pi 流量计数 (wlan0)')。

然后我尝试物理删除所有空格(并使用\),但仍然出现相同的错误,这次是我生成今天的日期造成的:

--watermark "Graph Drawn `date`"

正好是“星期四”。

希望这能帮助遇到与我同样问题的人。

相关内容