Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11
  1. #1
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324

    SMART Attribute überprüfen per Skript

    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!
    Geändert von dawiinci (04.04.2011 um 20:09 Uhr)

  2. #2
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324
    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
    Geändert von dawiinci (05.04.2011 um 14:01 Uhr)

  3. #3
    Gelber Richard
    Registriert
    12.2005
    Ort
    Alzenau
    Beiträge
    12.365
    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).

  4. #4
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324
    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.
    Geändert von dawiinci (05.04.2011 um 20:43 Uhr)

  5. #5
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324
    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)
    Geändert von dawiinci (07.04.2011 um 16:35 Uhr)

  6. #6
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324
    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?

  7. #7
    Galloway Pepping Avatar von fyysh
    Registriert
    01.2010
    Ort
    Rheinknie
    Alter
    33
    Beiträge
    1.348
    Zitat Zitat von dawiinci Beitrag anzeigen
    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 -
    The cause of the problem is:
    Don't worry; it's been deprecated.
    The new one is worse.

  8. #8
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324
    Danke, du darfst übrigens gerne den Sinn hinterfragen. Leider habe ich bisher keine bessere Möglichkeit gefunden.

  9. #9
    Schöner von Nordhausen
    Themenstarter

    Registriert
    10.2008
    Beiträge
    324
    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.

  10. #10
    Apfel der Erkenntnis Avatar von Irgendein Held
    Registriert
    06.2007
    Ort
    bei Bonn
    Beiträge
    731
    Doppelte Anführungszeichen escapen (\).
    52 2E 54 2E 46 2E 4D 21 0A 44 65 6E 6E 1F 73 69 65 1F 77 69 73 73 65 6E 1F 6E 69 63 68 74 2C 1F 77 61 73 1F 73 69 65 1F 74 75 6E 21

    Make it idiot-proof, and they'll make a better idiot.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •