The pipe is not interpreted in the read from file command

I am trying to write a wrapper script to test the health of the server. The commands to be used are in a separate file, passed as a command line argument to the script.
This file is read line by line. My script:

#!/bin/bash
set -x   # DEBUG MODE
FILENAME=$1
count=0
echo "Executing commands on `hostname`"
echo "The commands output can be found in /tmp/`hostname`_hc.txt"
echo "########### `hostname` ############ " > /tmp/`hostname`_hc.txt
while IFS= read COMMAND
do
let count++ 
echo >> /tmp/`hostname`_hc.txt  
echo "###################################################################" >> /tmp/`hostname`_hc.txt
echo "###################################################################" >> /tmp/`hostname`_hc.txt    
echo "$count : $COMMAND" >> /tmp/`hostname`_hc.txt
$COMMAND >> /tmp/`hostname`_hc.txt
echo "####################################################################" >> /tmp/`hostname`_hc.txt
echo "####################################################################" >> /tmp/`hostname`_hc.txt
echo >> /tmp/`hostname`_hc.txt
done < $FILENAME
echo "Commands executed on `hostname` " 

      

My test server healthcheck commands:

df -ak
vmstat 5 5
ls -lrt /opt/config/ | grep -i ss7
prtdiag -v 
ps -ef | grep ss7
swap -s
dmesg| grep "`date +%b %d`" | grep "swap space limit exceeded"
dmesg|grep -i ECC

      

While I am executing this script I am getting these errors for commands for which "|" pipe used:

For ls -lrt /opt/config/ | grep -i ss7

ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access ss7: No such file or directory

      

Likewise, for ps -ef | grep ss7

I am getting this error message

ERROR: Garbage option.
********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
T  all processes on this terminal     -s processes in the sessions given
a  all w/ tty, including other users  -t by tty
g  OBSOLETE -- DO NOT USE             -u by effective user ID (supports names)
r  only running processes             U  processes for specified users
x  processes w/o controlling ttys     t  by tty
*********** output format **********  *********** long options ***********
-o,o user-defined  -f full            --Group --User --pid --cols --ppid
-j,j job control   s  signal          --group --user --sid --rows --info
-O,O preloaded -o  v  virtual memory  --cumulative --format --deselect
-l,l long          u  user-oriented   --sort --tty --forest --version
-F   extra full    X  registers       --heading --no-heading --context
                ********* misc options *********
-V,V  show version      L  list format codes  f  ASCII art forest
-m,m,-L,-T,H  threads   S  children in sum    -y change -l format
-M,Z  security data     c  true command name  -c scheduling class
-w,w  wide output       n  numeric WCHAN,UID  -H process hierarchy

      

+3


source to share


1 answer


Probably need to change

$COMMAND >> /tmp/`hostname`_hc.txt

      



to

eval $COMMAND >> /tmp/`hostname`_hc.txt

      

+2


source







All Articles