PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : while Schleife bricht ab



Huhn Hur Tu
08.02.13, 15:24
Hi zusammen,

ich habe hier ein script dass in der while Schleife im zweiten Durchlauf keine Daten mehr hat.

Im ersten bekomme ich mein Ergebniss zurueck, beim zweiten wird nichts mehr aus der ttt.conf gelesen.

Hat da jeman eine Idee.

Gruss Stefan




#!/bin/bash

CONF0=./ttt.conf
HOST0=$1
PART=$2
myUSER=xxx
myPASS=xxx
myHOST=xxx


## SSH SOCKET
#export SSH_AUTH_SOCK=$(find /tmp/ssh-* -name "*agent*" -user druuhl)


## USAGE
echo "-----USAGE script host check"
echo "-----Checks are memory/space"

## CHECKS
HOSTNAME="hostname -f"
MEM="cat /proc/meminfo"
SPACE="df"

## THE FUNCTIONS
function stuff() {
case $PART in
memory )
ssh $USER0@$HOST0 "$HOSTNAME; $MEM" ;;

space )
ssh $USER0@$HOST0 "$HOSTNAME; $SPACE" ;;

esac
}


function all_stuff() {
ssh $USER0@$HOST0 "$HOSTNAME; $MEM; $SPACE" ## FILTER
}




## TEST FOR CONFIG
test -r $CONF0 || echo "$CONF not existing"


## SELECT FOR PARAMETERS
if [ -z $HOST0 ]
then
while read -r HOST0 USER0 ####Hier gibts Probleme
echo 43 #### Hier fehlt im zweiten Durchlauf der HOST0
echo $HOST0
do
if [ -z $PART ]
then
all_stuff
else
stuff
fi
echo 42
echo $HOST0
done < $CONF0
else
USER0=`grep $HOST0 $CONF0 | awk '{print $2}'`
if [ -z $PART ]
then
all_stuff
else
stuff
fi
fi

Aqualung
08.02.13, 15:58
Deiner while-Schleife fehlt "do" - "done".

http://www.cyberciti.biz/faq/bash-while-loop/

L00NIX
10.02.13, 08:17
Aus man bash zu read


-r Backslash does not act as an escape character. The backslash is considered to be part of the line. In particular, a backslash-newline pair may not
be used as a line continuation.


Kann es sein, dass durch das -r es nur eine Zeile, also einen Durchlauf gibt?

Das do müsste außerdem vor dem "echo 43" stehen.

Gruß
L00NIX

Huhn Hur Tu
11.02.13, 08:57
CONF0=./ttt.conf
while read -r HOST0 USER0
do if [ -z $PART ]
then all_stuff
else stuff
fi
done < $CONF0


Das done ist vorhanden, auch ohne die option -r schlaegt die Schleife fehl.

Ich habe auch die echos entfernt, waren ja nur da um mit den Schrittstatus anzuzeigen. Weiterhin Fehlanzeige.

Gruss Stefan

undefined
11.02.13, 19:17
Die bash ist empfindlich was den Syntax und Carriage Return betrifft.
Es gibt mehrere Arten für diese Schreibweise.
Die Sauberste A:


CONF0=./ttt.conf
while read -r HOST0 USER0 ; do
if test -z "$PART" ; then
echo "Wenn $PART NULL ist und nicht in Ausführungzeichen steht ergibt das einen Parsre Error!"
else
echo "$HOST0 $USER0"
fi
done < $CONF0


Zweite Variante erfordert Zeilenumbrüche


CONF0=./ttt.conf
while read -r HOST0 USER0
do
if [ -z "$PART" ]
then
echo "Wenn $PART NULL ist und nicht in Ausführungzeichen steht ergibt das einen Parsre Error!"
fi
done < $CONF0

Huhn Hur Tu
12.02.13, 10:10
Hi undefined, danke erst mal fuer den Hinweis, aber das ist es nicht, der Aussschnitt wurde nur vom Paste erlegt, hier nochmal in richtiger Formatierung



CONF0=./ttt.conf

if [ -z $HOST0 ]
then
while read HOST0 USER0
do
if [ -z $PART ]
then
all_stuff
else
stuff
fi
done < $CONF0
else
USER0=`grep $HOST0 $CONF0 | awk '{print $2}'`
if [ -z $PART ]
then
all_stuff
else
stuff
fi
fi


Bash -x


$ bash -x ./script

+ CONF0=./ttt.conf
+ HOST0=
+ PART=
+ myUSER=xxx
+ myPASS=xxx
+ myHOST=xxx
+ echo '-----USAGE script host check'
-----USAGE script host check
+ echo '-----Checks are memory/space'
-----Checks are memory/space
+ HOSTNAME='hostname -f'
+ MEM='cat /proc/meminfo'
+ SPACE=df
+ test -r ./ttt.conf
+ '[' -z ']'
+ read HOST0 USER0
+ '[' -z ']'
+ all_stuff
+ ssh moni@monitor01 'hostname -f; cat /proc/meminfo; df'
.
.
OUTPUT der Befehle
.
.
+ read HOST0 USER0

Strace Ausgabe nach dem Output


[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 6418
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fffca7a4798, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn(0xffffffffffffffff) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7fb373ebe4f0}, {0x443910, [], SA_RESTORER, 0x7fb373ebe4f0}, 8) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffca7a4da0) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(0, 0, SEEK_CUR) = 96
read(0, "", 128) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
dup2(10, 0) = 0
fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(10) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, " \n", 1025) = 2
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "", 1025) = 0
exit_group(0) = ?



Gruss Stefan

Aqualung
12.02.13, 11:04
Poste mal


od -c ./ttt.conf

Huhn Hur Tu
12.02.13, 12:31
od -c ./ttt.conf
0000000 s w i s m o n i t o r 0 1 \t m o
0000020 n i \n s w i s m o n i t o r 0 2
0000040 \t m o n i \n s w i s m o n i t o
0000060 r 0 3 \t m o n i \n s w i s m o n
0000100 i t o r 0 5 \t m o n i \n s w i s
0000120 j e n k i n s \t j e n k i n s \n
0000140

Aqualung
12.02.13, 13:39
Ich denke, das Problem liegt in der Funktion "all_stuff".

Bei Verbindungen auf entfernte Rechner würde ich Sicherungen wie




function all_stuff() {
ssh -o ConnectTimeout=10 $USER0@$HOST0 "$HOSTNAME; $MEM; $SPACE" || echo "Unable to connect" > /dev/stderr ## FILTER
}


einbauen.

Huhn Hur Tu
12.02.13, 14:02
Hi Aqualung,
soweit eine gute Idee aber es loest nicht mein initiales Problem dass die while Schleife nach dem ersten Durchgang beim read stehen bleibt.



Ich denke, das Problem liegt in der Funktion "all_stuff".

Bei Verbindungen auf entfernte Rechner würde ich Sicherungen wie




function all_stuff() {
ssh -o ConnectTimeout=10 $USER0@$HOST0 "$HOSTNAME; $MEM; $SPACE" || echo "Unable to connect" > /dev/stderr ## FILTER
}
einbauen.

Aqualung
12.02.13, 14:21
Irgendwie passt



0000000 s w i s m o n i t o r 0 1 \t m o
0000020 n i \n s w i s m o n i t o r 0 2

nicht zu


+ ssh moni@monitor01 'hostname -f; cat /proc/meminfo; df'

Huhn Hur Tu
13.02.13, 10:30
+ ssh -o ConnectTimeout=10 moni@swismonitor01 'hostname -f; cat /proc/meminfo; df'

evtl. nur ein Edit Fehler, im Moment kommt das richtige zustande

Gruss Stefan

Huhn Hur Tu
13.02.13, 14:50
Fuer einen Test habe ich in der Funktion all_stufff nur die Variablen ausgeben lassen und damit wurde die Schleife auch bis zum Ende durchgearbeitet.

Irgendetwas passt dem while an der Funktion nicht




function all_stuff() {
ssh -o ConnectTimeout=10 $USER0@$HOST0 "$HOSTNAME; $MEM; $SPACE" || echo "Unable to connect" > /dev/stderr
}
Gruss Stefan

Aqualung
13.02.13, 15:08
Quoten?



function all_stuff() {
ssh -o ConnectTimeout=10 ${USER0}@${HOST0} \" $HOSTNAME; $MEM; $SPACE \" || echo "Unable to connect" > /dev/stderr
}

Huhn Hur Tu
13.02.13, 15:29
Keine Veraenderung, leider

Huhn Hur Tu
13.02.13, 15:35
So jetzt noch dedizierter, irgendwas stoert sich an dem ssh aufruf
Folgendes klappt auch nicht, mit oder ohne quotes, wie gehabt immer noch wird nur die erste Zeile gelesen.



while read xx yy; do ssh ${yy}@${xx} "hostname -f";done < ttt.conf


Gruss Stefan

Huhn Hur Tu
14.02.13, 13:07
Von einem Kollegen den Tipp bekommen an das ssh ein -n anzuhaenge, seit dem funzt es, danke an alle fuers mitraten, happy bin.



-n Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote machine. For example, ssh -n shadows.cs.hut.fi emacs & will
start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the
-f option.)




Gruss Stefan