• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

SMART Attribute überprüfen per Skript

  • Ersteller Ersteller Benutzer 62153
  • Erstellt am Erstellt am

Benutzer 62153

Gast
SMARTreporter ist eine App, die HDDs regelmässig nach Fehlern überprüft. Da dieser Check teilweise unnötig die HDD aus dem Ruhezustand holt, möchte ich das gerne per Skript jeweils beim Start von Mac OS und beim Aufwachen aus dem Ruhezustand starten. Das schont die Platte und die HDD wird trotzdem regelmässig überprüft.


Das Skript soll folgendes können:

ermitteln aller angeschlossenen HDD (disk0, disk1, ...) mit
Code:
diskutil list

Alternativ disk0 bis disk20 durchtesten, falls HDD nicht vorhanden wird nichts ausgegeben.

alle gefundenen HDD überprüfen mit:
Code:
diskutil info diskX | grep SMART

Solange Ergebnis = SMART Status: Verified oder Not Supported (USB), muss nichts unternommen werden. Bei einem Fehler (failing) wird ein zweiter Teil ausgeführt.

Zusätzlich werden alle Logs nach I/O Fehlern (Textsuche nach: I/O error) durchsucht, falls gefunden -> Teil zwei.


Teil zwei des Skripts

Versende Mail an bestimmte Adresse mit folgendem Inhalt und gebe ein Dialogfeld aus.
Fehlerart: SMART oder IO Error
Computername
Datum und Uhrzeit


Danke für jede Hilfe!
 
Zuletzt bearbeitet von einem Moderator:
Ich konnte ein Skript erstellen, das zumindest einen Teil meiner Anforderungen erfüllt. Was jetzt noch fehlt sind folgende Sachen:

  1. disk0 soll bis disk 20 wiederholt werden: repeat with x from (0) to (25) end repeat?
  2. Wenn im Log kein Error gefunden wurde gibt AS einen Fehler aus: Der Befehl wurde mit einem Ergebnis ungleich Null beendet.
  3. Ich bin nicht sicher, ob alle I/O Error im system.log sind.
  4. Wie kann ich der Mail eine hohe Priorität geben?
  5. Das Skript (.scpt) soll täglich um 12:00 gestartet werden. Aber nur, wenn der Computer nicht im Ruhezustand ist. Konnte das Skript nicht ausgeführt werden, wird es zum nächstmöglichen Zeitpunkt gestartet. Das sollte mit launchd doch irgendwie gehen oder nicht?


Code:
set smartstatus to do shell script "

diskutil info disk0 | grep SMART"

Code:
if smartstatus does not contain "Not Supported" and smartstatus does not contain "Verified" then
	display dialog "Die interne Festplatte ist möglicherweise beschädigt!" & return & return & return & status buttons {"Verstanden"} with icon stop default button 1
Code:
tell application "Mail"
	set theNewMessage to make new outgoing message with properties {subject:"Festplatte möglicherweise defekt!", content:"Es gibt Anzeichen, dass eine Festplatte defekt ist. 
	
	
	
	
	Folgende SMART Fehler wurden registriert: 
	
		" & smartlog & "", visible:true}
	tell theNewMessage
		make new to recipient at end of to recipients with properties {address:"email adresse"}
		send
	end tell
end tell
end if




Code:
set statuslog to do shell script "

find /var/log/system.log | xargs grep I/O Error"
Code:
if statuslog contains "I/O Error" then
	display dialog "Laut Logbuch, konnte das System einige Daten nicht richtig schreiben. Die interne Festplatte ist möglicherweise beschädigt!" & return & return & return & statuslog buttons {"Verstanden"} with icon stop default button 1

Code:
tell application "Mail"
	set theNewMessage to make new outgoing message with properties {subject:"Festplatte möglicherweise defekt!", content:"Es gibt Anzeichen, dass eine Festplatte defekt ist. 
	
	
	
	
	Das Logbuch enthält folgende Berichte über Transferfehler: 
	
		" & statuslog & "", visible:true}
	tell theNewMessage
		make new to recipient at end of to recipients with properties {address:"email adresse"}
		send
	end tell
end tell
end if
 
Zuletzt bearbeitet von einem Moderator:
Du hast alle 20 Platten intern bzw. über eSATA angeschlossen?
Über USB und FireWire wird der Smart-Status nämlich nicht übertragen (ist jedenfalls mein Wissensstand).
 
Nein, ich möchte nur ein universelles Skript erstellen. Angenommen es werden vier SATA HDDs angeschlossen, was ja am Mac Pro geht. Dann könnte es doch sein, dass ein paar Sticks, Speicherkarten usw. vor einer eSata Platte nummeriert werden und diese würde dann nicht überprüft. Mehr als 20 Speichermedien sind dann doch etwas utopisch. ;)

PS. Es gibt einige wenige USB Chipsätze, die SMART durchschleifen.
 
Zuletzt bearbeitet von einem Moderator:
Jetzt hab ich noch ein wichtiges Problem zu lösen:

Wie kann ich herausfinden welche Disks angeschlossen sind disk0, disk1, ... und diese dann dem Shellscript übergeben? Das würde einiges vereinfachen. (repeat x times)
 
Zuletzt bearbeitet von einem Moderator:
Eine weitere Möglichkeit wäre, den Befehl einfach für alle Disks auszuführen.

Da habe ich aber ein Problem: Existiert die HD nicht, dann wird mit einem Fehler abgebrochen.

Code:
set smartstatus to do shell script "

diskutil info disk0 | grep SMART
diskutil info disk1 | grep SMART
diskutil info disk2 | grep SMART"

Ich habe testweise eine externe HD angeschlossen. Da ich keine diks2 habe, wird das Skript abgebrochen. Gibt es im Shell eine Art try Befehl wie in AS?
 
Wie kann ich herausfinden welche Disks angeschlossen sind disk0, disk1, ...
In AS z.B. so:
Code:
set availableDisks to every paragraph of (do shell script "diskutil list | awk '$1 ~ \"/dev/disk[0-9]*\"'")
=> gibt ne loopbare Liste

Mit der bash könnte man so...
Code:
 for i in $(diskutil list | awk '$1 ~ "/dev/disk[0-9]*"');do echo $i ist verfügbar;done


Oder ganz doof:
Code:
 find /dev -maxdepth 1 -name 'disk[0-9]'
gibt dir auch ne brauchbare Liste.

- ohne den Sinn des Projektes zu hinterfragen -
 
Danke, du darfst übrigens gerne den Sinn hinterfragen. Leider habe ich bisher keine bessere Möglichkeit gefunden.
 
Direkt als Shell Skript funktioniert es bestens. Jetzt möchte ich gerne den Code in ein AS einfügen.

Code:
set smartstatus to do shell script "

for i in $(diskutil list | awk '$1 ~ "/dev/disk[0-9]*"');do diskutil info $i | grep SMART;done
"

Das geht leider nicht. Ich vermute die Anführungszeichen beenden das Shell Skript. Wie kann ich das umgehen?

SYNTAXFEHLER
„„[““ kann nicht diesem „Identifier“ folgen.