Xymon Mailing List Archive search

custom script fails when I add ssh command

3 messages in this thread

list Oliver · Thu, 15 Dec 2011 16:01:07 -0500 ·
I have 6 servers in my hosts.cfg file that use a custom script with a
HOSTTAG of cdr

The script is located at $XYMONHOME/ext/check_cdr.sh

If I make it as basic as possible, it all runs perfectly.  For example:

================================
#!/bin/bash -x

HOSTTAG=cdr
COLUMN=$HOSTTAG

$XYMONHOME/bin/xymongrep $HOSTTAG | while read L
do
   set $L       # To get one line of output from xymongrep
   HOSTIP="$1"
   MACHINEDOTS="$2"
   MACHINE=`echo $2 | $SED -e's/\./,/g'`
   COLOR=green
   MSG="running on ${MACHINE}"
   $XYMON $XYMSRV "status $MACHINE.$COLUMN $COLOR `date`
   ${MSG}
   "
done

exit 0
================================

I realise the test itself is useless, it's just to demonstrate the problem.

Since I have the -x on the first line, I see it iterate through all 6
servers in the log file I specified in the tasks.cfg file

This is part of the output, going from the first server to the second

+ /apps/xymon/server/bin/xymongrep cdr
+ read L
+ set 10.64.91.99 as1wdc1 '#' cdr
+ HOSTIP=10.64.91.99
+ MACHINEDOTS=as1wdc1
++ echo as1wdc1
++ /usr/bin/sed '-es/\./,/g'
+ MACHINE=as1wdc1
+ COLOR=green
+ MSG='running on as1wdc1'
++ date
+ /apps/xymon/server/bin/xymon 127.0.0.1 'status as1wdc1.cdr green Thu
Dec 15 20:57:41 GMT 2011
   running on as1wdc1
   '
+ read L
+ set 10.64.123.67 as2dal1 '#' cdr
+ HOSTIP=10.64.123.67
+ MACHINEDOTS=as2dal1


But if I add the following line to the script,  directly above the
"$XYMON $XYSERVER... " one, I only see the first server get queried
before the script exits and ultimately, my other 5 servers go purple.

/usr/bin/ssh bwadmin@${MACHINE} "hostname"

With the ssh line, my last bit of output in the log file is:

+ /usr/bin/ssh bwadmin at as1wdc1 hostname
AS1WDC1
++ date
+ /apps/xymon/server/bin/xymon 127.0.0.1 'status as1wdc1.cdr green Thu Dec 15 20
:52:37 GMT 2011
   running on as1wdc1
   '
+ read L
+ exit 0

What is it about the ssh command that causes the "while read L" loop to fail?

Thanks
list Ralph Mitchell · Thu, 15 Dec 2011 20:04:00 -0500 ·
I think ssh is "draining" the input stream, which in this case means the
pipeline coming into the while loop.  Try redirecting the ssh input stream
from /dev/null:

      /usr/bin/ssh bwadmin@${MACHINE} "hostname" < /dev/null

I tested that with this command line:

     ls | while read a; do ssh 192.168.1.4 hostname < /dev/null ; done

and got back the remote host name once for each file in the local directory.

Ralph Mitchell
quoted from Oliver


On Thu, Dec 15, 2011 at 4:01 PM, oliver <user-c44cbd0c692f@xymon.invalid> wrote:
I have 6 servers in my hosts.cfg file that use a custom script with a
HOSTTAG of cdr

The script is located at $XYMONHOME/ext/check_cdr.sh

If I make it as basic as possible, it all runs perfectly.  For example:

================================
#!/bin/bash -x

HOSTTAG=cdr
COLUMN=$HOSTTAG

$XYMONHOME/bin/xymongrep $HOSTTAG | while read L
do
  set $L       # To get one line of output from xymongrep
  HOSTIP="$1"
  MACHINEDOTS="$2"
  MACHINE=`echo $2 | $SED -e's/\./,/g'`
  COLOR=green
  MSG="running on ${MACHINE}"
  $XYMON $XYMSRV "status $MACHINE.$COLUMN $COLOR `date`
  ${MSG}
  "
done

exit 0
================================

I realise the test itself is useless, it's just to demonstrate the problem.

Since I have the -x on the first line, I see it iterate through all 6
servers in the log file I specified in the tasks.cfg file

This is part of the output, going from the first server to the second

+ /apps/xymon/server/bin/xymongrep cdr
+ read L
+ set 10.64.91.99 as1wdc1 '#' cdr
+ HOSTIP=10.64.91.99
+ MACHINEDOTS=as1wdc1
++ echo as1wdc1
++ /usr/bin/sed '-es/\./,/g'
+ MACHINE=as1wdc1
+ COLOR=green
+ MSG='running on as1wdc1'
++ date
+ /apps/xymon/server/bin/xymon 127.0.0.1 'status as1wdc1.cdr green Thu
Dec 15 20:57:41 GMT 2011
  running on as1wdc1
  '
+ read L
+ set 10.64.123.67 as2dal1 '#' cdr
+ HOSTIP=10.64.123.67
+ MACHINEDOTS=as2dal1


But if I add the following line to the script,  directly above the
"$XYMON $XYSERVER... " one, I only see the first server get queried
before the script exits and ultimately, my other 5 servers go purple.

/usr/bin/ssh bwadmin@${MACHINE} "hostname"

With the ssh line, my last bit of output in the log file is:

+ /usr/bin/ssh bwadmin at as1wdc1 hostname
AS1WDC1
++ date
+ /apps/xymon/server/bin/xymon 127.0.0.1 'status as1wdc1.cdr green Thu Dec
15 20
:52:37 GMT 2011
  running on as1wdc1
  '
+ read L
+ exit 0

What is it about the ssh command that causes the "while read L" loop to
fail?

Thanks

list Oliver · Fri, 16 Dec 2011 09:42:50 -0500 ·
quoted from Ralph Mitchell
On Thu, Dec 15, 2011 at 8:04 PM, Ralph Mitchell <user-00a5e44c48c0@xymon.invalid> wrote:
I think ssh is "draining" the input stream, which in this case means the
pipeline coming into the while loop.  Try redirecting the ssh input stream
from /dev/null:

      /usr/bin/ssh bwadmin@${MACHINE} "hostname" < /dev/null

I tested that with this command line:

     ls | while read a; do ssh 192.168.1.4 hostname < /dev/null ; done

and got back the remote host name once for each file in the local directory.
Yes - that fixed everything.  Thank you so much for the replying.