Rückgabewert ob ein short test läuft (smartctl, bash)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von phill971 » 04.04.2016 12:59:37

Hallo zusammen,

ich möchte ein Script (Bash) schreiben, welches mit smartctl einen short test ausführt und wenn dieser zu Ende ist die Smartwerte ausgibt mit -a. Allerdings weiß ich nicht so recht, wie ich herausfinde, ob ein short test noch läuft?

Mit

Code: Alles auswählen

smartctl -t short /dev/sda
starte ich den Test. Ich kann unter

Code: Alles auswählen

smartctl -a /dev/sda
sehen, ob der Test fertig ist oder noch läuft, allerdings brauche ich einen definierten Rückgabewert, ob gerade der Selftest läuft, da das Script erst dann weiter laufen soll.

Hoffentlich hat jemand von euch eine Idee, Lösung oder einen Workaround parat.

Danke und liebe Grüße
Phill

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von tobo » 04.04.2016 14:42:11

Man könnte smartctl selbst befragen:

Code: Alles auswählen

#smartctl -a  /dev/sda |grep execution
Self-test execution status:      ( 241) Self-test routine in progress...

#smartctl -a  /dev/sda |grep execution
Self-test execution status:      (   0) The previous self-test routine completed
EDIT: Ok, richtig lesen sollte man schon. Man könnte alternativ aber nach "completed" bzw. "in progress" suchen und den Rückgabewert vom grep auswerten.
Zuletzt geändert von tobo am 04.04.2016 14:51:28, insgesamt 1-mal geändert.

phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von phill971 » 04.04.2016 14:48:56

tobo hat geschrieben:Man könnte smartctl selbst befragen:

Code: Alles auswählen

#smartctl -a  /dev/sda |grep execution
Self-test execution status:      ( 241) Self-test routine in progress...

#smartctl -a  /dev/sda |grep execution
Self-test execution status:      (   0) The previous self-test routine completed
Danke für deine Antwort, da hast du durchaus recht. Ich hoffe allerdings darauf, dass es eine Möglichkeit gibt, einen fest definierten Rückgabewert zu bekommen (0 oder 1, z.B.). Das Script nach

Code: Alles auswählen

Self-test execution status:      (   0) The previous self-test routine completed

suchen zu lassen ist ja auch nicht unbedingt die feine englische Art... Ich bin leider noch nicht wissend genug, wie ich das dann geschickterweise im Script verpacke... :roll:

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von smutbert » 04.04.2016 14:57:28

Du brauchst ja nicht nach dem kompletten Text zu suchen

Code: Alles auswählen

if smartctl -a  /dev/sda | grep "Self-test execution status:" | grep "completed" &> /dev/null; then
    echo "Selbsttest läuft momentan!"
else
    echo "es läuft kein Selbsttest"
fi
dann könnte man es ev auch in zwei if-Aufspalten, damit man anders reagiert, wenn es gar keine Zeile mit "Self-test execution status:" gibt und man daher gar nicht sicher weiß ob jetzt so ein Test läuft oder nicht.

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von tobo » 04.04.2016 15:03:18

phill971 hat geschrieben:Ich hoffe allerdings darauf, dass es eine Möglichkeit gibt, einen fest definierten Rückgabewert zu bekommen (0 oder 1, z.B.).
Ich hatte oben noch mal editiert.
Das Script nach

Code: Alles auswählen

Self-test execution status:      (   0) The previous self-test routine completed

suchen zu lassen ist ja auch nicht unbedingt die feine englische Art...
Wenn, dann nach "progress", da "completed" in der Ausgabe möglicherweise auch durch "failed" oder "aborted" ersetzt werden könnte!? Das grep ansich ist nicht unschön, unschön wird's nur, wenn das auf einen Polling-Mechanismus rausläuft. Wenn also andauernd und solange abgefragt wird, bis das Ergebnis stimmt. Wobei dir allerdings ja auch die ungefähre Zeit angegeben wird und Du mit sleep warten könntest. Aber vielleicht kann da jemand noch was besseres vorschlagen...

phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von phill971 » 06.04.2016 16:13:01

Hallo,

danke für eure Antworten!

ich mache es nun so

Code: Alles auswählen

smartctl -a /dev/sda |grep "Self-test execution status:" |grep "completed" &> /dev/null;
Damit funktioniert es so, wie ich es brauche. Sollte bei dem Test etwas anderes rauskommen als "completed" bricht das komplette Skript bewusst ab und der Rechner wird dann händisch überprüft.. Um das zu gewährleisten möchte ich das ganze als Schleife laufen lassen. Es wird alle 30 Sekunden geprüft, ob der Test fertig ist, wenn ja wird die Schleife vorzeitig beendet, wenn nicht, läuft sie von vorne. Das ganze soll 30 mal passieren, somit gebe ich dem Test 15 Minuten Zeit, laut Smartmontools ist der Short-Test auf 2 Minuten beschränkt, von daher sollte das mehr als ausreichend sein um den Test erfolgreich beenden zu können, falls möglich. Und wenn die Platte streikt wird das Skript nach 15 Minuten spätestens abgebrochen.

Nun habe ich allerdings das Problem, dass er zwar tut was er soll.. Aber am Ende folgende Fehlermeldung ausspuckt:

Code: Alles auswählen

./smart2.sh: Zeile 10: [: =30: Ganzzahliger Ausdruck erwartet.
Woran liegt das, wie kann ich das beheben?

Hier ist das Skript als ganzes:

Code: Alles auswählen

#!/bin/bash

Datum=`date +%Y-%m-%d-%H-%M`
LOGFILE='./logs/logfile.txt'
echo $Datum >>$LOGFILE
echo -e "\n" >>$LOGFILE
smartctl -t short /dev/sda >>$LOGFILE
i=0
while [ $i -le 30 ]
	do
			if smartctl -a /dev/sda |grep "Self-test execution status:" |grep "completed" &> /dev/null;
			then
				echo -e "\nShort self test done\n" >>$LOGFILE
				smartctl -a /dev/sda >>$LOGFILE
				i==30
			else
				sleep 30
				let i=$i+1
				echo $i
			fi
	done
Danke nochmals für eure Hilfe!

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von smutbert » 06.04.2016 16:46:35

phill971 hat geschrieben:

Code: Alles auswählen

#!/bin/bash
[…]
				i==30
[…]
Das weist der Variable i den Wert "=30" zu — bestimmt nicht das was du eigentlich erreichen willst und es passt zur Fehlermeldung ("=30: Ganzzahliger Ausdruck erwartet.").

phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von phill971 » 07.04.2016 10:50:58

smutbert hat geschrieben:
phill971 hat geschrieben:

Code: Alles auswählen

#!/bin/bash
[…]
				i==30
[…]
Das weist der Variable i den Wert "=30" zu — bestimmt nicht das was du eigentlich erreichen willst und es passt zur Fehlermeldung ("=30: Ganzzahliger Ausdruck erwartet.").
Ja, das war auch meine Vermutung. Wenn ich allerdings
mache, dann läuft er komplett Amok. Dann startet er den Shorttest, wartet bis er fertig ist und dann schreibt er endlos die Ausgabe von

Code: Alles auswählen

smartctl -a /dev/sda
ins Logfile. Woran liegt das?

Ich habe es jetzt erstmal umgangen, in dem ich in der While-Schleife -le durch != ersetzt habe. Somit sollte er das Skript ja trotzdem bei 30 Durchläufen abbrechen, da ich ihn ja im "else"-Fall jeweils i+1 rechnen lasse. Oder bin ich da jetzt wieder auf dem Holzweg?

Danke nochmals für eure Hilfe!

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von smutbert » 07.04.2016 13:21:01

wenn du i einmal auf 30 setzt, weil der Selbsttest fertig ist, kommst du nicht mehr aus deiner Schleife:

Mit 30 ist le (less or equal) 30 wahr und die if Abfrage ist auch immer noch wahr → i wurde zwar gar nicht verändert, wird aber erneut auf 30 gesetzt und es geht von vorne los. Die einzige Möglichkeit herauszukommen wäre wohl einen Selbsttest zu starten, damit die if-Abfrage falsch und i wieder hochgezählt wird…

…oder dein Skript zu verändern :wink:
(ich weiß nicht was genau du vor hast, ich habe nur auf deinen letzten Beitrag mit der Fehlermeldung geantwortet und mir ist auch jetzt nicht klar was du mit dem Hochzählen von i erreichen willst. Die Schleife könntest du jedenfalls innerhalb deines if…then mit break verlassen.)
Zuletzt geändert von smutbert am 07.04.2016 13:41:51, insgesamt 1-mal geändert.

phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von phill971 » 07.04.2016 13:38:01

Danke für deine Antwort.
Was will ich damit eigentlich erreichen?
Ich möchte ein Skript haben, welches bei der Festplatte einen Selbsttest anwirft und dann abwartet bis dieser fertig ist. Um zu wissen, wann der Test durchlaufen ist, lasse ich das Skript für 30 Sekunden schlafen und zähle i um 1 hoch. Dann frage ich wieder ab, ob der Selbsttest fertig ist. Sobald er fertig ist, soll das Skript beendet werden, ich dachte dafür könnte ich einfach i auf 30 setzen. Dabei habe ich allerdings nicht bedacht, dass le für less or EQUAL steht...

Warum lasse ich es überhaupt bis 30 zählen?
Ich möchte, für den Fall dass der Selbsttest fehlschlägt oder nicht vollständig durchlaufen kann, weil die Festplatte einen Defekt hat, verhindern, dass der Test endlos läuft. Deshalb möchte ich das ganze auf 15 Minuten beschränken. Durch das Warten von jeweils 30 Sekunden und 30 Durchläufen müsste ich ja auf ungefähr 15 Minuten kommen (auf +/- 1min kommt es nicht an).

Ich werde es auf jeden Fall nochmal mit break versuchen. Kann ich es - guten Gewissens - auch einfach mit != lassen? Beim erfolgreichen Selbsttest hört er dann auf, sobald ich i=30 setze, wenn er allerdings 30mal durchgelaufen ist sollte es doch auch funktionieren, oder?

Ich habe leider bisher wenig Erfahrung mit dem Skripten, habe mich vorher nur mit Java in der Berufsschule beschäftigt und daher lässt mein Wissensstand leider zu wünschen übrig. Umso dankbarer bin ich euch jedoch für jede Hilfestellung :THX:

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Rückgabewert ob ein short test läuft (smartctl, bash)

Beitrag von smutbert » 07.04.2016 14:15:13

Du könntest i ja stattdessen auf 31 setzen - das sollte doch in deinem Skript funktionieren?

ich möchte halt keine schlechten Ratschläge geben, weil ich mich beim Skripten eher anstelle wie ein Hund beim Eierlegen, aber ich hätte es eher mit dem "Zählen" von Sekunden versucht. in etwa so (habs nicht selbst ausprobiert):

Code: Alles auswählen

#!/bin/bash

typeset -i Startzeit=$SECONDS
typeset -i maximalZeit=7200

Datum=`date +%Y-%m-%d-%H-%M`
LOGFILE='./logs/logfile.txt'
echo $Datum >>$LOGFILE
echo -e "\n" >>$LOGFILE
smartctl -t short /dev/sda >>$LOGFILE

while true
   do
         if smartctl -a /dev/sda | grep "Self-test execution status:" | grep "completed" &> /dev/null;
         then
            echo -e "\nShort self test done\n" >>$LOGFILE
            smartctl -a /dev/sda >>$LOGFILE
            break
         elif [ $(expr $SECONDS - $Startzeit) -gt $maximalZeit ];
         then
            echo "Selbsttest dauert zu lange!" >>$LOGFILE
            break
         fi
         sleep 30s
   done

Antworten