expr not working


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting expr not working
# 1  
Old 12-31-2010
expr not working

I have written below script which monitors a log file and if log file is not writting for 2 intervels then admin should be notified.

================

Code:
sh=`date | awk '{print $4}' | cut -d ":" -f1`
sm=`date | awk '{print $4}' | cut -d ":" -f2`
lh=`ls -l /opt/Heartbeat.log | awk '{print $8}' | cut -d ":" -                                              f1`
lm=`ls -l /opt/Heartbeat.log | awk '{print $8}' | cut -d ":" -                                              f2`
if [ "$sh" = "$lh" ]
then
  if [ "$sm" = "$lm" ]
  then
    echo "Database written properly"
  else
    echo "Database failed to written"
    echo $x
    x=`expr $x + 1`
    echo $x
    if [ "$x" = "2" ]
    then
      mailx -s "Data base failed written - Need to retrieve missing data" -c "abc@xyz.com"<<EOF
    else
      echo "Hello"
    fi
  fi
else
  echo "Hi"
fi

===============

If i run the above script in Solaris 8 OS, i am getting followin error message. Pls correct me where i wrong.

------ Error Msg -------
Code:
$ sh test.sh
Database not being written

expr: syntax error

Hello

-------------------------


Moderator's Comments:
Mod Comment Please use code tags when posting data and code samples, thank you.

Last edited by Franklin52; 12-31-2010 at 09:37 AM.. Reason: Please indent your code and use code tags
# 2  
Old 12-31-2010
This is because x is not defined/set before it is used in expr.
Following works:
Code:
x=1
x=`expr $x + 1`
echo $x

# 3  
Old 12-31-2010
My requirement is x should be 0 initially and when log not written first time it should increase by 1 and when it fails second time then it should be notified to user.
# 4  
Old 12-31-2010
How long is an "interval"?
# 5  
Old 12-31-2010
Assuming that you are running the script at different times.
So you need a way to track database failure. x is local to the program and you need some external way to track it.
You may use a file for this.
When script runs 1st time, create a file and store 0 in that. Then put new value based on Database failed (increment value) or success (reset to zero).
When script runs next times, read that value, process and put that value back for next time processing.
Create interval file in some directory (say /abc/def/)where user has permission ot create file. Then
Code:
sh=`date | awk '{print $4}' | cut -d ":" -f1`
sm=`date | awk '{print $4}' | cut -d ":" -f2`
lh=`ls -l /opt/Heartbeat.log | awk '{print $8}' | cut -d ":" - f1`
lm=`ls -l /opt/Heartbeat.log | awk '{print $8}' | cut -d ":" - f2`
if [ -f "/abc/def/interval.dat" ]; then
   echo "0" > /abc/def/interval.dat
fi
x=$(cat /abc/def/interval.dat)
if [ "$sh" = "$lh" ]
then
if [ "$sm" = "$lm" ]
then
echo "Database written properly"
echo "0" > /abc/def/interval.dat
else
echo "Database failed to written"
echo $x
x=`expr $x + 1`
echo "$x" > /abc/def/interval.dat
echo $x
if [ "$x" = "2" ]
then
mailx -s "Data base failed written - Need to retrieve missing data" -c "abc@xyz.com"<<EOF
else
echo "Hello"
fi
fi
else
echo "Hi"
fi

# 6  
Old 12-31-2010
I have to point out that the script will not work. Hoping that the update of the heartbeat file and that the invokation this script will occur in same minute, all the time, is not realistic. Cron, which I assume you are using to invoke the script, is not that deterministic. Now if that is why you are running the script twice, it would be far easier to write a script that answers the requirement "has the heartbeatfile been updated since the the last time I checked?" That script would look something like:
Code:
#! /bin/ksh

DBHB=/opt/Heartbeat.log  # updated by database processes
DBCK=/opt/Heartbeat.ck   # created if heartbeat file has not been updated

FMT='%x %H:%M:%S'     # date/time stamp for logfile

#===============================================================================

if [[ ! -f "${DBCK}" ]]; then
    date "+${FMT} - initializing" > ${DBCK}
fi

if [[ ! -f "${DBHB}" ]]; then
    date "+${FMT} - missing ${DBHB}" >> ${DBCK}

    # insert additional commands here

    exit
fi

if [[ "${DBHB}" -nt "${DBCK}" ]]; then
    date "+${FMT} - ok" >> ${DBCK}
else
    date "+${FMT} - database failure" >> ${DBCK}

    # insert additional commands here
fi

exit

Just run this from cron.

If the databases not updating the hearthbeat file for "two intervals" is a requirement, the script would need an additional check file, similar to the interval.dat file used by @anurag.singh, as in:
Code:
#! /bin/ksh

NAME=$(basename ${0})
FILE=/var/log/${NAME}.log # current state of the database

DBHB=/opt/Heartbeat.log  # updated by database processes
DBCK=/opt/Heartbeat.ck   # created if heartbeat file has not been updated

FMT='%x %H:%M:%S'     # date/time stamp for logfiles

#===============================================================================

if [[ ! -f "${FILE}" ]]; then
    date "+${FMT} - initializing" > ${FILE}
fi

if [[ ! -f "${DBHB}" ]]; then
    date "+${FMT} - missing ${DBHB}" >> ${FILE}
    # insert additional commands here
    exit 1
fi


if [[ "${DBHB}" -nt "${FILE}" ]]; then
    #  Everything is ok, the heathbeat file is newer than the logfile

    rm -f "${DBCK}"
    date "+%x %X - ok" >> ${FILE}
    exit 0
fi

#
#  Everything is not ok. If the heathbeat checkfile exists, then this
#  is the second time we detected that the the database hearthbeat
#  file has not been updated, so send out an elert.
#

if [[ -f "${DBCK}" ]]; then
    date "+${FMT} - database failure" >> ${FILE}
    # insert additional commands here
else
    date "+${FMT} - checking database" >> ${FILE}
    touch ${DBCK}
fi

exit 1

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Nn$( expr $n + 1)

HI there I am trying to understand Shell scripting to create my own, I am attempting a few examples can anyone tell me what this means?n=$( expr $n + 1)Tried looking on the internet, but just cannot find its anywhere :( .Help please (4 Replies)
Discussion started by: steve2015
4 Replies

2. Shell Programming and Scripting

If + expr

Hi I have bellow script: t1=`cat node1.txt | grep thread1 | cut -f2 -d '-'` t2=`cat node2.txt | grep thread2 | cut -f2 -d '-'` t3=`cat node1_rcat.txt | grep thread1 | cut -f2 -d '-'` t4=`cat node2_rcat.txt | grep thread2 | cut -f2 -d '-'` if ]; then echo "no restore" >> log.log... (6 Replies)
Discussion started by: primo102
6 Replies

3. Shell Programming and Scripting

/usr/local/bin/expr function not working

Legends, I am not able to set "expr" function in ksh script. Below is the sample code i used, and output is as "Syntax error" Please help me to come out of it. OUTPUT (9 Replies)
Discussion started by: sdosanjh
9 Replies

4. Shell Programming and Scripting

Error with expr - "expr: syntax error"

Hi All, I'm writing a shell script in KSH, where I want to store the filename, total record count and actual record count of all the source files. The source files reside in 4 different sub-folders under the same root folder. Below is code: #!/usr/bin/ksh... (6 Replies)
Discussion started by: jagari
6 Replies

5. UNIX for Dummies Questions & Answers

expr ?!

Hey there i want to subtract the content from $b from $a. Each variable has got 18 values (normal numbers from 0 - 99). How can i subtract them? I know i have to use the expr command, this is what i have till now: a=`cat Tabelle.dat | awk {'print $4'} | awk -F: {'print $1'}` b=`cat... (1 Reply)
Discussion started by: Mad van Bert
1 Replies

6. Shell Programming and Scripting

the expr \*

$ cat > mtable #!/bin/sh # #Script to test for loop # # if then echo "Error - Number missing form command line argument" echo "Syntax : $0 number" echo "Use to print multiplication table for given number" exit 1 fi n=$1 for i in 1 2 3 4 5 6 7 8 9 10 do echo "$n * $i = `expr $i \*... (1 Reply)
Discussion started by: jackel7777
1 Replies

7. Shell Programming and Scripting

expr not working

I am trying to get some coubt through the following code. tot_ln_cnt=`wc -l ${OUTPUT_FILE_NAME}` echo "tot_ln_cnt : "$tot_ln_cnt fl_cnt=`ls -lrt *edi | wc -l` echo "fl_cnt : "$fl_cnt exclude_cnt=`expr $fl_cnt \* 2` echo "exclude_cnt : "$exclude_cnt ln_cnt=`expr $tot_ln_cnt - $exclude_cnt`... (4 Replies)
Discussion started by: mady135
4 Replies

8. Shell Programming and Scripting

test expr VS [ expr ]

What is the difference between test expr VS . For example : if test 5 -eq 6 echo "Wrong" and if echo "Wrong" bot will give the same output as Wrong. Now, what is the difference between these two? though they are producing the same result why we need two? Any answer will be... (2 Replies)
Discussion started by: ashok.g
2 Replies

9. Red Hat

how to use expr

i am new to shell programming, currently using redhat linux of version 2.4.20-8. i have problem in executing expr command in the following shell script $ x=5 $ x='expr $x + 1' $ echo $x the output is displaying always expr $x + 1 Pls guide me for the above query (3 Replies)
Discussion started by: saikumarm80
3 Replies

10. UNIX for Dummies Questions & Answers

expr

Hello! I want to evaluate some mathematical expressions in a script and I try to use 'expr' command. Unfortunatally, when I have, for example, expr 8.2 + 6 the result is 'expr: non-numeric argument' Why ? I work on SunOs 5.7. Thanks in advance Nathe (5 Replies)
Discussion started by: Nathe
5 Replies
Login or Register to Ask a Question