views:

46

answers:

1

I would like to echo text and also remotely ping a computer and have the output be sent to a log file. I also need to do this in parallel but I am having some trouble with how the output is being sent into the log file.

I would like the output to look like: host | hostTo | result of ping command

but since I have this running as a background process it is outputting: host hostTo host hostTo rtt rtt rtt etc...

Is there a way to allow this to be a background process but make it so that the echo is part of that process, so the logfile isn't out of order?

here's my script, thanks in advance!

 for host in `cat data/ips.txt`; do 
 echo -n "$host ";
 for hostTo in `cat data/ips.txt`; do
 {
     echo -n "$host $hostTo " >> logs/$host.log;
    (ssh -n -o StrictHostKeyChecking=no -o ConnectTimeout=1 -T username@$host ping -c 10 $hostTo | tail -1 >> logs/$host.log) &

 };
done; 
done
+2  A: 

It's possible to do this with awk. What you're basically asking is how to print out the hosts as well as the result at the same time.

ie. Remove the line with echo and change the following:

ssh .... ping -c 10 $hostTo | awk -v from=$host -v to=$hostTo 'END {print from, to, $0}' >> logs/${host}.log

Note that tail is effectively being done inside awk also. Including shell var inside awk tends to be a PITA, maybe there's an easier way to do it without all the escaping and quotes. [Updated: Assign var in awk]

PS. The title of your question is a little unclear, it does sounds like you want to pipe your program output to the display and file at the same time.

fseto
`awk -v awkvar=$shellvar 'END {printf awkvar}'`
Dennis Williamson
@Dennis, Thanks! updated.
fseto
I solved this using "'"$host"'" within the awk section, but this seems to be the same thing just a different way. Thanks!
Isawpalmetto
@Isawpalmetto: It's *much* more readable and maintainable to use variable passing instead of complex quoting.
Dennis Williamson