[LØST]Bashscript sammenlign af tidsstempel

peque
Antal: 866
Tilmeldt:
20-04-2005
User is offline
[LØST]Bashscript sammenlign af tidsstempel

hej Gruppe.
Jeg har et drillede problem som jeg ikke lige ved hvordan nemmest gribes an :-)

Jeg har et timestamp som jeg har i mit bash script - skrevet som "2015-06-21 12:40:00"

Hvordan kan jeg sammenligne dette med date kommandoen DATE=`date +%Y-%m-%d %H:%M:%S`og finde ud af om den er mere end 24 timer nemmest.
Jeg er klar over det skal konverteres til integer eller lign for at kunne sammenlignes, men syntes kun at kunne finde guides for datoen - ikke inkl timer. Det vigtige er her 24 timer/1 døgn

Hvis dette tidstempel er over 24 timer skal der ske en handling - alt dette er på plads - det er selve sammenligningen af de 2 datoer.

Hvordan kan jeg dette


marlar
Antal: 2823
Tilmeldt:
05-12-2009
User is offline
Dette giver dig tidsstemplet

Dette giver dig tidsstemplet for samme tid i morgen:

date --date="+24 hours" "+%Y-%m-%d %H:%M:%S"

2015-09-03 20:32:49

Dette kan du så sammenligne. Du kan også skrive -24 hours for at få i går osv.

Edit: når jeg læser dit spørgsmål igen, er jeg usikker på om jeg har svaret på det rigtige. Du må lige forklare nærmere hvad du mener hvis jeg har ramt forkert.


lbm
lbm's picture
Antal: 807
Tilmeldt:
14-06-2006
User is offline
Du kan konvertere begge

Du kan konvertere begge tider til UNIX timestamp, trække dem fra hinanden og hvis forskellen er mere end 24 timer (i sekunder), så trig.


peque
Antal: 866
Tilmeldt:
20-04-2005
User is offline
Jeg prøver at forklare lidt

Jeg prøver at forklare lidt mere :-)

Jeg har en database med tabeller i - i disse tabeller er der et felt - timestamp - der skriver sin tid som
2015-06-21 12:40:00

Dette er tidspunktet for sidst inserted data - Dette skal sammenlignes med det aktuelle tid NU - og er den mere end 24timer siden - skal der trigges en mail.

Jeg har fået kringlet lidt hvordan jeg kan sammenligne disse tidstempler via dateutils i debian.
Da der er flere tabeller der tjekkes for hver gang - er tabeller lagt i array og for hver tabel - tjekker den alderen på tidstemplet.
Dette gøres ved at sende tidstemplet fra Database til en script der bruger dateutils.ddiff

Men når jeg sender det konkrete tidstempel til det script der tjekker filen - får jeg dette ud:
date: extra operand â%H:%M:%Sâ
For at bruge denne datekommando
DATE=`date +%Y-%m-%d %H:%M:%S`

Er det fordi jeg mangler quotes omkring eller lign


lbm
lbm's picture
Antal: 807
Tilmeldt:
14-06-2006
User is offline
Kender ikke lige date util,

Kender ikke lige date util, men Som jeg skriver ovenfor du kan konvertere tiden til UNIX timestamp både i det fra DB'en og den lokale tid med date kommandoen.


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
date: extra operand

#3: date: extra operand â%H:%M:%Sâ
For at bruge denne datekommando
DATE=`date +%Y-%m-%d %H:%M:%S`

Er det fordi jeg mangler quotes omkring eller lign

Ja, ret til:
DATE=`date "+%Y-%m-%d %H:%M:%S"`


peque
Antal: 866
Tilmeldt:
20-04-2005
User is offline
[LØST]

Selve script ser således ud:

#!/bin/bash
# This script detects the age of latest data of tables.
# Rev 001:
# The script detects the age of timestamp in each table in DB
# Created Tabkes in Array and calls the check-script with the
# latest inserted timestamp in table.
#   * ./check_age.sh
# Start with checking the date for 72hours and then 24hours
# And send a email
[ -r /script/config.sh ] && . /script/config.sh
# Params
TBL=$(mysql -D$DB -u$USER -p$PASSWD -se "SHOW TABLES")
# RECIEVER='pbj@insatech.com'

for t in "${TBL[@]}"
        do
        # DBGET=`mysql -u$USER -p$PASSWD -s -N -e "SELECT timestamp FROM $DB.$t order by timestamp desc limit 1"`
        /script/check_age.sh $t

done

# EOF
################################################
# check_age.sh
#!/bin/bash
# This script is called from mysqldata_date.sh
# To check the latest timestamp againt the date
# now
[ -r /script/config.sh ] && . /script/config.sh

# Param
# Current time now
DATE=`date "+%Y-%m-%d %H:%M:%S"`
# Param from mysqldata.sh
TBL=$1
# Getting timestamp from DB
DBGET=`mysql -u$USER -p$PASSWD -s -N -e "SELECT timestamp FROM $DB.$TBL order by timestamp desc limit 1"`
# Return aINT value of days
RES=`/usr/bin/dateutils.ddiff -e "$DBGET" "$DATE" -f "%H"`
# Maillog for
LOG="/script/log"
# echo $RES

# Starting with more than 72 hours.
if [ $RES -gt 71 ]
then
        touch $LOG
        echo "The Table $TBL has not been updated for more than 72 hours!!!" >> $LOG
        echo " " >> $LOG
        echo "Please take action as soon as possible" >> $LOG
        echo " " >> $LOG
        echo "This is only a warning for outdated data in database" >> $LOG
        mail -s "$DB MySQL Data more than 72 hours outdated" $REC < $LOG
        rm -rf $LOG
        exit
fi

if [ $RES -eq 24 ]
then
        touch $LOG
        echo "The Table $DB has not been updated for 24hours" >> $LOG
        echo " " >> $LOG
        echo "Please take action as soon as possible" >> $LOG
        echo " " >> $LOG
        echo "This is only a warning for outdated data in database" >> $LOG
        mail -s "$DB MySQL Data 24 hours outdated" $REC < $LOG
        rm -rf $LOG
        exit
fi

#EOF
##################################
Og så samlet config param i config.sh
# /script/config.sh
####################################################
# This file contains the config file for MySQL Data
# Age Mail warning system for Insatech
# ##################################################
# Revision description in mysqldata.sh
####################################################

# MySQL Database
DB=" "

# MySQL User
USER=" "

# MySQL Password
PASSWD=" "

# Mail Reciever
REC=" "

# EOF

Dette tjekker i timer hvor gammel den sidse inserted statement i Mysql table field timestamp

Håber andre også kan få glæde af dette