c.monty
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
Hallo! Ich benötige Hilfe für den korrekten Syntax des Bash Scripts, das folgende Aufgabe erfüllen soll: Es soll alle 30 sec. geprüft werden, ob der Server 1.2.3.4 online ist. Wenn nach x Prüfungen der Server immer noch offline ist, soll eine entsprechende Fehlermeldung zurückgegeben werden. Wenn der Server dagegen nach 1-x Prüfungen online ist, dann soll eine "Aktion" ausgeführt werden. Der Syntax für die besagt Aktion ist vorhanden und auch funktional geprüft. THX
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4391
Wohnort: Göttingen
|
Da stellt sich die Frage, wie Du denn prüfen möchtest, ob der Server online ist. Da gibt es diverse Möglichkeiten. Einfach ein ping oder eher eine Prüfung, ob die auf dem Server laufenden Dienste auch richtig funktionieren?
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
Hm... Eine Prüfung mit Netcat wäre erstmal ausreichend:
| nc -w 3 -z $REMOTE_SERVER $REMOTE_PORT 2> /dev/null
|
Die Prüfung der laufenden Dienste wäre aus meiner Sicht erst der übernächste Schritt.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
c.monty schrieb: Eine Prüfung mit Netcat wäre erstmal ausreichend:
| nc -w 3 -z $REMOTE_SERVER $REMOTE_PORT 2> /dev/null
|
Die Prüfung der laufenden Dienste wäre aus meiner Sicht erst der übernächste Schritt.
Gut, für den übernächsten Schritt 😉 kannst Du dann den Rückgabewert von nc auswerten. Z. B.:
#!/bin/sh
while true
do
if [ "$(nc -4nz -w 1 176.28.12.60 80 < /dev/null; echo $?)" != 0 ]
then
echo "Server ist offline"
sleep 30
fi
if [ "$(nc -4nz -w 1 176.28.12.60 80 < /dev/null; echo $?)" != 1 ]
then
echo "Server ist online"
exit 0
fi
done
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12830
|
lubux schrieb:
Gut, für den übernächsten Schritt 😉 kannst Du dann den Rückgabewert von nc auswerten. Z. B.:
Das geht aber direkter, als in Deinem Skript: Du benutzt eine Command Substitution um den Exit-Status von nc auszugeben und ihn dann mit 0 zu vergleichen. Das macht man aber direkt: | if ! nc -4nz -w 1 176.28.12.60 80; then
echo offline
fi
|
Mit "-z" braucht man die Eingabeumleitung von /dev/null nicht. Ich würde das so machen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/dash
# arg 1: IP (defaults to 176.28.12.60)
# arg 2: port (defaults to 80)
repeat=10
while :; do
nc -4nz -w 1 ${1:-176.28.12.60} ${2:-80} && exit
repeat=$((repeat - 1))
test $repeat -gt 0 || exit
sleep 30
done
exit 2
|
Der Exit-Status in Zeile 9 und 11 wird durch die logische Verknüpfung passend auf denjenigen des vorher ausgeführten Kommandos gesetzt: in Zeile 9 ist er 0 und in Zeile 11 ungleich 0. Ciao robert
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
rklm schrieb: Ich würde das so machen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/dash
# arg 1: IP (defaults to 176.28.12.60)
# arg 2: port (defaults to 80)
repeat=10
while :; do
nc -4nz -w 1 ${1:-176.28.12.60} ${2:-80} && exit
repeat=$((repeat - 1))
test $repeat -gt 0 || exit
sleep 30
done
exit 2
|
Hallo Robert, warum verwendest du die Server-Parameter in der Form
| ${1:-176.28.12.60} ${2:-80}
|
und nicht
| $REMOTE_SERVER $REMOTE_PORT
|
, wobei diese Parameter im Script hardcodiert sind? THX
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12830
|
c.monty schrieb: Bitte keine unnötigen Fullquotes.
warum verwendest du die Server-Parameter in der Form
| ${1:-176.28.12.60} ${2:-80}
|
und nicht
| $REMOTE_SERVER $REMOTE_PORT
|
, wobei diese Parameter im Script hardcodiert sind?
Weil das flexibler ist. Wenn Du einen anderen Server prüfen willst, dann kannst Du das Skript einfach mit dessen IP (oder Hostnamen, aber dann muss noch die Option "-n" raus) und Port (falls nicht 80) aufrufen. Du willst ja dasselbe Skript nicht noch mal schreiben, bloß, weil Du einen anderen Rechner überwachen willst.
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
Verstehe. Das Script macht nun folgendes:
+ nmcli c up uuid 97bc4bad-b462-4a9b-9375-12345678
+ logger -s 'vpn connected'
manfred: vpn connected
+ sleep 1
+ repeat=10
+ :
+ nc -z -w 1 remote_server 22
+ exit Es wird eine VPN-Verbindung zum Remote-Netzwerk aufgebaut.
Dann wird überprüft, ob der Server "remote_server" online ist, d.h. über Port 22 erreichbar.
Nach erfolgreicher Überprüfung steigt das Script aus mit exit. An dieser Stelle sollte aber der nächste Schritt ausgeführt werden: rsync von Remote-Verzeichnis mit lokalem Verzeichnis und und und: Wie muss der Syntax lauten, damit dieses Coding ausgeführt wird und nicht der exit-Befehl kommt? Bisher sieht das Script so aus; damit wird aber nur einmalig geprüft, ob der Server online ist:
| nc -w 3 -z $REMOTE_SERVER $REMOTE_PORT 2> /dev/null
if [ $? -eq 0 ] ; then
rsync --delete -avzbe ssh ${SYNC_USER}@${REMOTE_SERVER}:${SOURCE_DIR}/ ${DESTINATION_DIR}/ --backup-dir=${BACKUP_DIR}
logger -s "rsync executed"
#echo "rsync ausgeführt" >> /tmp/vpn-connect.log
sleep 2
remmina -c /home/${SYNC_USER}/.remmina/13954819876543.remmina
logger -s "remmina started"
|
Das verbesserte Script soll eben x mal prüfen, ob der Server online ist.
Und wenn der Server online ist, dann soll obige Funktionen ausgeführt werden. THX
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
Kein Update?
Ich wäre für jeden Hinweis zur Lösung sehr dankbar...
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
Ich habe das Script von Robert im Debug-Mode ausgeführt:
| + nmcli c up uuid 97bc4bad-b462-4a9b-9375-12345678
+ logger -s 'vpn connected'
manfred: vpn connected
+ sleep 1
+ repeat=10
+ :
+ nc -z -w 1 remote_server 22
+ exit
|
Meine Interpretation:
Es wird eine VPN-Verbindung zum Remote-Netzwerk aufgebaut.
Dann wird überprüft, ob der Server "remote_server" online ist, d.h. über Port 22 erreichbar. Nach erfolgreicher Überprüfung steigt das Script aus mit exit. An dieser Stelle sollte aber der nächste Schritt ausgeführt werden: rsync von Remote-Verzeichnis mit lokalem Verzeichnis
| rsync --delete -avzbe ssh ${SYNC_USER}@${REMOTE_SERVER}:${SOURCE_DIR}/ ${DESTINATION_DIR}/ --backup-dir=${BACKUP_DIR}
|
und und und... Wie muss der Syntax lauten, damit dieses Coding ausgeführt wird und nicht der exit-Befehl kommt?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12830
|
c.monty schrieb: Ich habe das Script von Robert im Debug-Mode ausgeführt:
| + nmcli c up uuid 97bc4bad-b462-4a9b-9375-12345678
+ logger -s 'vpn connected'
manfred: vpn connected
+ sleep 1
+ repeat=10
+ :
+ nc -z -w 1 remote_server 22
+ exit
|
Das ist keine Ausgabe des Skriptes aus meinem Vorschlag.
Meine Interpretation:
Es wird eine VPN-Verbindung zum Remote-Netzwerk aufgebaut.
Dann wird überprüft, ob der Server "remote_server" online ist, d.h. über Port 22 erreichbar. Nach erfolgreicher Überprüfung steigt das Script aus mit exit.
Genau. Das (also meins) Skript prüft nur, ob der Server da ist. So hatte ich Deine Anforderung verstanden.
Wie muss der Syntax lauten, damit dieses Coding ausgeführt wird und nicht der exit-Befehl kommt?
Ich würde das vermutlich in einem anderen Skript machen und das von mir generisch lassen. Dann kannst Du den anderen Code im aufrufenden Skript haben: | # Variblen setzen...
if server-is-up ${REMOTE_SERVER} 22; then
rsync --delete -avzbe ssh ${SYNC_USER}@${REMOTE_SERVER}:${SOURCE_DIR}/ ${DESTINATION_DIR}/ --backup-dir=${BACKUP_DIR}
else
echo "ERROR: could not connect to ${REMOTE_SERVER}" >&2
exit 1
fi
|
Übrigens würde ich die Variablen, die lokal zum Skript sind, immer klein benennen. Das erleichter die Unterscheidung von den Variablen aus der Umgebung ($PATH und Konsorten). Ciao robert
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
OK... mein Fehler. Zurück zu Roberts Script:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/dash
# arg 1: IP (defaults to 176.28.12.60)
# arg 2: port (defaults to 80)
repeat=10
while :; do
nc -4nz -w 1 ${1:-176.28.12.60} ${2:-80} && exit
repeat=$((repeat - 1))
test $repeat -gt 0 || exit
sleep 30
done
|
Ich nehme an, der exit in Zeile 9 muss ersetzt werden... aber wie?
Wenn der Server online ist, dann soll rsync ausgeführt werden, kein exit. THX
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12830
|
c.monty schrieb:
Ich nehme an, der exit in Zeile 9 muss ersetzt werden... aber wie?
Wenn der Server online ist, dann soll rsync ausgeführt werden, kein exit.
Wie gesagt, ich würde das in einem zweien Skript machen, das dieses aufruft. Dann kannst Du den generischen "ist der Server da?"-Code auch für andere Zwecke verwenden. Sonst musst Du den exit durch { rsync ...; exit; } ersetzten. Aber, wie gesagt, so würde ich das nicht machen, weil die Aufteilung auf zwei Skripte modularer ist.
|
c.monty
(Themenstarter)
Anmeldungsdatum: 23. August 2007
Beiträge: 277
|
Wäre es auch möglich, das Script in verschiedene Funktionen zu unterteilen, die dann entsprechend aufgerufen werden? Sinngemäß sähe es dann so aus: - Funktion 1: Überprüfung ob Server online - Funktion 2: Ausführen von rsync - Funktion 3: Ausführen von ... usw. Welcher Coding-Syntax würde dies abbilden?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12830
|
c.monty schrieb: Wäre es auch möglich, das Script in verschiedene Funktionen zu unterteilen, die dann entsprechend aufgerufen werden?
Klar.
Sinngemäß sähe es dann so aus: Funktion 1: Überprüfung ob Server online Funktion 2: Ausführen von rsync Funktion 3: Ausführen von ...
usw. Welcher Coding-Syntax würde dies abbilden?
Du packst den jeweiligen Code in eine Funktion und rufst diese dann entsprechend auf. Das ist aber meist nur sinnvoll, wenn Du Code innerhalb des Skriptes wiederverwenden willst oder die funktionalen Einheiten so groß sind, dass man anders nicht die Übersicht behält.
|