Problem mit Script

Z

Zuendler

Registriert
Thread Starter
Dabei seit
18.08.2014
Beiträge
2
Reaktionspunkte
0
Ich grüße euch,
habe folgendes Prob. Ich möchte meinen Server 3 x alle 10 Sekunden prüfen ob er alive ist, danach möchte ich das das Skript endet.
Folgendes habe ich schon zusammengebastelt, leider raffe ich das mit der Schleife nicht, kenne das zwar von VB habe aber mit AppelScript noch nicht gearbeitet.
Danke im voraus.

PHP:
set serv to "192.168.1.215"
set volList to {"D", "E", "F"}
set firstMount to true
set i to 0


repeat while i > 3
if my checkServer(serv) then
repeat with vol in volList
-- check, if volume isn't already mounted
if vol is not in (list disks) then
-- check, if that's the first attempt to mount a volume of the server
if firstMount then
try
mount volume "smb://" & serv & "/" & vol
set i to i + 3
on error
mount volume "smb://" & serv & "/" & vol
set i to i + 3
end try
else
mount volume "smb://" & serv & "/" & vol
set i to i + 3
end if
end if
set firstMount to false
end repeat
else
delay 10
set i to i + 1
end if
end repeat


on checkServer(ServerIP)
try
set t to do shell script "ping -c 1 " & ServerIP
if t contains "0% packet loss" then
return true
else
return false
end if
on error
return false
end try
end checkServer
 
Zuletzt bearbeitet von einem Moderator:
Mir ist die Frage nicht ganz klar...die Kontrollstrukturen sind im AppleScript Language Guide recht ausführlich erläutert, falls Englisch kein Problem darstellt? :)
 
was soll denn die schleife machen?
das mit den abbruch bedingungen ist nicht so ganz ersichtlich…
und das mehrfache mounten mit i hochzählen für die endlos schleife?
 
Code:
contains "0% packet loss" then

Und das ist auch einer der hartnäckigen ping-Standarts :faint:
 
den Server Check kannst du abkürzen:

Code:
[FONT="Verdana"][size=2][b]on[/b] [color=#408000]checkServer[/color]([color=#408000]ServerIP[/color])
	[b]try[/b]
		[color=#0016B0][b]do shell script[/b][/color] "ping -t2 -c1 " & [color=#408000]ServerIP[/color]
		[b]return[/b] [color=#6C05D3][i]true[/i][/color]
	[b]on[/b] [b]error[/b]
		[b]return[/b] [color=#6C05D3][i]false[/i][/color]
	[b]end[/b] [b]try[/b]
[b]end[/b] [color=#408000]checkServer[/color][/size][/FONT]

Edit:

So ganz verstehe ich dein Problem trotzdem nicht... wieso musst du den Server 3 mal anpingen? und das alle 10 Sekunden??

entweder er ist da oder ist nicht da, wenn da dann mounten, wenn nicht da einschalten... (wobei man das einschalten vielleicht über ein WoL machen könnte wenns unterstützt wird)

erkläre mal genau was du vor hast....
 
Vielleicht ist es sowas, was du meinst:

Code:
[FONT="Verdana"][size=2][b]set[/b] [color=#3F7F00]serv[/color] [b]to[/b] "192.168.1.215"
[b]set[/b] [color=#3F7F00]volList[/color] [b]to[/b] {"D", "E", "F"}

[b]repeat[/b] 3 [b]times[/b]
	[b]if[/b] [b]my[/b] [color=#3F7F00]checkServer[/color]([color=#3F7F00]serv[/color]) [b]then[/b]
		[b]repeat[/b] [b]with[/b] [color=#3F7F00]vol[/color] [b]in[/b] [color=#3F7F00]volList[/color]
			[color=#4C4D4D]-- check, if volume isn't already mounted[/color]
			[b]if[/b] [color=#3F7F00]vol[/color] [b]is not[/b] [b]in[/b] ([color=#0016B0][b]list disks[/b][/color]) [b]then[/b]
				[color=#4C4D4D]-- check, if that's the first attempt to mount a volume of the server[/color]
				[b]try[/b]
					[color=#0016B0][b]mount volume[/b][/color] "smb://" & [color=#3F7F00]serv[/color] & "/" & [color=#3F7F00]vol[/color]
					[b]exit[/b] [b]repeat[/b]
				[b]on[/b] [b]error[/b]
					[color=#0016B0][b]mount volume[/b][/color] "smb://" & [color=#3F7F00]serv[/color] & "/" & [color=#3F7F00]vol[/color]
					[b]exit[/b] [b]repeat[/b]
				[b]end[/b] [b]try[/b]
			[b]else[/b]
				[color=#0016B0][b]mount volume[/b][/color] "smb://" & [color=#3F7F00]serv[/color] & "/" & [color=#3F7F00]vol[/color]
				[b]exit[/b] [b]repeat[/b]
			[b]end[/b] [b]if[/b]
		[b]end[/b] [b]repeat[/b]
	[b]else[/b]
		[color=#0000FF][b]delay[/b][/color] 10
	[b]end[/b] [b]if[/b]
[b]end[/b] [b]repeat[/b]


[b]on[/b] [color=#3F7F00]checkServer[/color]([color=#3F7F00]ServerIP[/color])
	[b]try[/b]
		[color=#0016B0][b]do shell script[/b][/color] "ping -t2 -c1 " & [color=#3F7F00]ServerIP[/color]
		[b]return[/b] [color=#6C04D4][i]true[/i][/color]
	[b]on[/b] [b]error[/b]
		[b]return[/b] [color=#6C04D4][i]false[/i][/color]
	[b]end[/b] [b]try[/b]
[b]end[/b] [color=#3F7F00]checkServer[/color][/size][/FONT]

die Schleife wird 3 mal ausgeführt. Ist der Server erreichbar, werden die Laufwerke verbunden und die Schleife beendet.

ist der Server nicht erreichbar beginnt nach 10 Sekunden der nächste durchlauf...

Das firstMount benötigst du nicht, das war im original Script zur Speicherung und Abfrage des Passwortes für das Mounten.

Das i benötigts Du durch
Code:
repeat 3 times
auch nicht....
 
Du machst
Code:
set i to 0
und dann
Code:
repeat while i > 3
das ist dann nicht sehr oft ...
BTW das
Code:
set i to i + 3
kanns Du auch hinter das
Code:
if  firstMount
setzen
 
Code:
[FONT=Verdana][SIZE=2]
            [B]if[/B] [COLOR=#3F7F00]vol[/COLOR] [B]is not[/B] [B]in[/B] ([COLOR=#0016B0][B]list disks[/B][/COLOR]) [B]then[/B]
                ...
            [B]else[/B]
                [COLOR=#0016B0][B]mount volume[/B][/COLOR] "smb://" & [COLOR=#3F7F00]serv[/COLOR] & "/" & [COLOR=#3F7F00]vol[/COLOR]
                [B]exit[/B] [B]repeat[/B]
            [B]end[/B] [B]if[/B]
[/SIZE][/FONT]
Das könntest du mit else if korrigieren, aber einen counter finde ich klarer.
Oder innen nochmal ein repeat 3 times (try mount on error delay 10) einbauen.
Oder man belässt es einfach bei 2 Versuchen.
Die nächsten Versuche würde ich delayen.

Ein boolscher Ping-Einzeiler:
Code:
if ((do shell script "ping -c1 -t1 " & serv & " &>/dev/null && echo true || echo false") as boolean) then ...
 
Zuletzt bearbeitet:
da hast du natürlich recht.... wobei mir der sinn immernoch nicht klar ist....

ich bei mir ein ähnliches Script im Einsatz... ist mein NAS an, wird direkt verbunden, ist es aus wird erst ein WoL geschickt und nach delay 20 verbunden (mein NAS brauch etwas bis es oben ist)
 
Poste deins doch mal hier.
 
mach ich gerne wenn ich nachher zu Hause bin, das läuft auf meinem heimischen mac....
 
so, hier ist das Script was ich zu Hause am NAS nutze...

Code:
[FONT="Verdana"][size=2][b]property[/b] [color=#3F7F00]myNASMac[/color] : "FC:F5:28:76:B3:6D"
[b]property[/b] [color=#3F7F00]theAwakePath[/color] : "/usr/local/bin/awake" [b]as[/b] [color=#0000FF][i]POSIX file[/i][/color] [color=#4C4D4D]--Pfad zum Python Programm Awake[/color]
[b]property[/b] [color=#3F7F00]myNAS[/color] : "192.168.178.29"
[b]property[/b] [color=#3F7F00]myMntList[/color] : {"eyeTV", "Filme", "MusiK", "Daten"}


[b]if[/b] [b]my[/b] [color=#3F7F00]checkServer[/color]([color=#3F7F00]myNAS[/color]) [b]then[/b]
	[b]repeat[/b] [b]with[/b] [color=#3F7F00]mnt[/color] [b]in[/b] [color=#3F7F00]myMntList[/color]
		[color=#0016B0][b]mount volume[/b][/color] "smb://" & [color=#3F7F00]myNAS[/color] & "/" & [color=#3F7F00]mnt[/color]
	[b]end[/b] [b]repeat[/b]
[b]else[/b]
	[color=#0016B0][b]display notification[/b][/color] "NAS schläft und wird geweckt!"
	[b]my[/b] [color=#3F7F00]wakeMe[/color]([color=#3F7F00]myNASMac[/color], [color=#3F7F00]theAwakePath[/color])
	[color=#0000FF][b]delay[/b][/color] 20
	[b]repeat[/b] [b]with[/b] [color=#3F7F00]mnt[/color] [b]in[/b] [color=#3F7F00]myMntList[/color]
		[color=#0016B0][b]mount volume[/b][/color] "smb://" & [color=#3F7F00]myNAS[/color] & "/" & [color=#3F7F00]mnt[/color]
	[b]end[/b] [b]repeat[/b]
[b]end[/b] [b]if[/b]


[color=#0016B0][b]display notification[/b][/color] "Alle Laufwerke verbunden !"
[color=#0000FF][b]delay[/b][/color] 1


[b]on[/b] [color=#3F7F00]checkServer[/color]([color=#3F7F00]ServerIP[/color])
	[b]try[/b]
		[color=#0016B0][b]do shell script[/b][/color] "ping -t2 -c1 " & [color=#3F7F00]ServerIP[/color]
		[b]return[/b] [color=#6C04D4][i]true[/i][/color]
	[b]on[/b] [b]error[/b]
		[b]return[/b] [color=#6C04D4][i]false[/i][/color]
	[b]end[/b] [b]try[/b]
[b]end[/b] [color=#3F7F00]checkServer[/color]

[b]on[/b] [color=#3F7F00]wakeMe[/color]([color=#3F7F00]tMAC[/color], [color=#3F7F00]tPath[/color])
	[color=#0016B0][b]do shell script[/b][/color] [color=#6C04D4]POSIX path[/color] [b]of[/b] [color=#3F7F00]tPath[/color] & " " & [color=#3F7F00]tMAC[/color]
[b]end[/b] [color=#3F7F00]wakeMe[/color]
[/size][/FONT]

das awake Programm kann man über den Terminal installieren oder auch im Applescript:

Code:
[FONT="Verdana"][size=2][b]tell[/b] [color=#0000FF][i]application[/i][/color] "Terminal"
	[color=#0016B0][b]do shell script[/b][/color] "easy_install awake" [b]with[/b] [color=#0016B0]administrator privileges[/color]
[b]end[/b] [b]tell[/b][/size][/FONT]

auf die Fehlerbehandlung hab ich verzichtet, da es nur bei mir läuft...
 
Vielen dank für die tollen Antworten hier, werde nachher mich mal dran setzen und alles etwas genauer lesen und nachvollziehen.
Also nochmal zur Problemstellung:
Ich klappe mein MacBook auf (vorher im Ruhezustand gewesen) , jetzt wird mein NAS gestartet. Das dauert natürlich einen Moment, im schlechtesten Fall ist er nicht erreichbar.
Beim Aufklappen des MacBook, also beim aufwecken aus dem Ruhezustand soll dann geprüft werden ob der Server an ist,
Wenn Server nicht erreichbar, warte 10 Sekunden und versuch es nochmal.
Wenn es bei 3 Versuchen nicht geklappt hat beende Skript und Msg: Server nicht erreichbar.
wenn ja dann prüfe ob Laufwerke noch oder schon gemountet.
Wenn Laufwerke gemountet, mach nix, wenn nicht dann mounten.


Das ist was ich machen wollte.
 
Zuletzt bearbeitet:
Hallo Zuendler,

genau so mache ich es mit meinem MacBook und NAS.

Habe dazu mein Script aus Post #12

das Programm awake musst Du einmal installieren und dein NAS dahin gehend konfigurieren das es auch per Wake on Lan angesprochen werden kann.

Das sollten aber die meisten anständigen NAS können... meins ist ein Zyxel NSA 310

Grüße

Michael
 
Zurück
Oben Unten