rc.local führt beim Start meine Skripte nicht richtig aus

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

rc.local führt beim Start meine Skripte nicht richtig aus

Beitrag von phill971 » 25.04.2016 15:55:41

Hallo,

ich baue derzeit ein Diagnosesystem mit dem Debian Live Builder. Dafür habe ich Skripte geschrieben, welche diverse Diagnosetools aufrufen und abarbeiten. So Weit so gut, die Skripte machen was sie sollen, jetzt möchte ich die Skripte nach dem Systemstart automatisiert ausführen lassen. Ich habe ein Kontrollskript, welches alle anderen Skripte nacheinander abarbeitet. Ich habe dieses Skript in /etc/rc.local eingetragen.
Beim Start wird die rc.local auch ausgeführt, das Skript startet (es schreibt zumindest eine Fehlermeldung des ersten Skripts in das Logfile) und scheint dann abzubrechen.
Führe ich die rc.local nach dem Systemstart händisch aus, wird eine Fehlermeldung ausgegeben

Code: Alles auswählen

/skripte/startdiagnosis.sh: 15: /skripte/startdiagnosis.sh: function: not found
/skripte/startdiagnosis.sh: 16: /skripte/startdiagnosis.sh: [[:
/skripte/startdiagnosis.sh: 22: /skripte/startdiagnosis.sh: Syntax error: "}" unexpected:
Gehe ich jedoch in den Ordner /skripte/, kann ich startdiagnosis.sh ausführen und sie läuft durch.
Alle Skripte, sowie rc.local sind Ausführbar.. Ich weiß mir langsam keinen Rat mehr.

Ich hoffe ihr könnt mir weiter helfen.
Besten Dank und liebe Grüße
Phill

Anbei die Skripte, sowohl das Kontrollskript startdiagnosis.sh als auch das erste ausgeführte Skript dmesg.sh:

startdiagnosis

Code: Alles auswählen

#!/bin/bash

#Dieses Skript ist das Kontrollskript für alle weiteren Diagnosewerkzeuge
#Es startet die jeweiligen Diagnosetools und dokumentiert, ob diese problemlos durchgelaufen sind

#Erstellt Ordner zum Speichern der Logdateien
mkdir -p /tmp/Logfiles/tests
mkdir -p /tmp/Logfiles/bin

#Definitionen
LOGFILE='/tmp/Logfiles/summary.txt'
>$LOGFILE

#Da im Fehlerfall dmesg in die Logdatei geschrieben wird, prüft diese Funktion, ob dmesg erfolgreich geschrieben wurde
function dmesg2 {
	if [[ $? -eq 0 ]]
        	then
                	echo "dmesg wurde erfolgreich vervollständigt" >>$LOGFILE
        	else
                	echo "dmesg fehlgeschlagen" >>$LOGFILE
	fi
}

#Erstmalige Ausgabe von dmesg, dmesg-Log wird dabei gesäubert
./dmesg.sh
if [[ $? -eq 0 ]]
        then
                echo "dmesg geschrieben" >>$LOGFILE
        else
                echo "dmesg nicht geschrieben" >>$LOGFILE
fi

#Startet das Hardwareinventory und schreibt das Ergebnis in die Logdatei
./hardware.sh
if [[ $? -eq 0 ]]
        then
        	echo "Hardwareinventory lshw abgeschlossen" >>$LOGFILE
        else
	        echo "Hardwareinventory lshw fehlgeschlagen" >>$LOGFILE
		./dmesg.sh
		dmesg2
fi

./inxi.sh
if [[ $? -eq 0 ]]
	then
		echo "Hardwareinventory inxi abgeschlossen" >>$LOGFILE
	else
		echo "Hardwareinventory inxi fehlgeschlagen" >>$LOGFILE
		./dmesg.sh
		dmesg2
fi

#Startet den Hauptspeichertest und schreibt das Ergebnis in die Logdatei
#Die Exitcodeabfrage für den Hauptspeichertest arbeitet mit einem Switchcase-Verfahren, da es mehrere Exitcodes gibt
./memtest.sh
case $? in
0)
	echo "Memtest erfolgreich" >>$LOGFILE
	;;
1)
	echo "Memtest fehlgeschlagen, Fehlercode 'x01 error alloccating or locking memory, or invocation error'" >>$LOGFILE
	echo "fehlgeschlagen"
	./dmesg.sh
	dmesg2
	./buildhtml.sh
	./report.sh
	exit 1
	;;
2)
	echo "Memtest fehlgeschlagen, Fehlercode 'x02 error during stuck address test'" >>$LOGFILE
	./dmesg.sh
	dmesg2
	./buildhtml.sh
	./report.sh
	exit 2
	;;
4)
	echo "Memtest fehlgeschlagen, Fehlercode 'x04 error during one of the other tests'" >>$LOGFILE
	./dmesg.sh
	dmesg2
        ./buildhtml.sh
        ./report.sh
        exit 4
	;;
esac
echo "nach memtest"
#Startet den Smarttest und schreibt das Ergebnis in die Logdatei
./smart.sh
if [[ $? -eq 0 ]]
       	then
               	echo "Smarttest abgeschlossen" >>$LOGFILE
echo "smart1"
       	else
echo "smart2"
               	echo "Smarttest abgebrochen" >>$LOGFILE
		./dmesg.sh
		dmesg2
        	./buildhtml.sh
        	./report.sh
        	exit
fi
echo "nach smart"
#Startet die Virenprüfung und schreibt das Ergebnis in die Logdatei
#./clamav.sh
echo hallo
case $? in
0)
	echo "Virenprüfung ohne Funde abgeschlossen!" >>$LOGFILE
	;;

1)
	echo "Virenprüfung mit Schädlingsfund abgeschlossen!" >>$LOGFILE
        ./buildhtml.sh
        ./report.sh
        exit
	;;

2)
	echo "Virenprüfung wurde aufgrund eines Fehlers abgebrochen!" >>$LOGFILE
	./buildhtml.sh
        ./report.sh
        exit
	;;
esac

#Startet die Suche und Komprimierung der Windowslogdateien. Auch hier wird Switchcase genutzt, da es mehrere Exitcodes gibt
./winlogs.sh
case $? in
0)
	echo "Windowslogs verpackt" >>$LOGFILE
	;;
1)
	echo "Windowslogs nicht verpackt, Fehler beim Komprimieren mit xz" >>$LOGFILE
	./dmesg.sh
	dmesg2
	./buildhtml.sh
        ./report.sh
        exit
	;;
2)
	echo "Windowslogs nicht verpackt, Fehler beim Verpacken mit tar" >>$LOGFILE
	./dmesg.sh
	dmesg2
        ./buildhtml.sh
        ./report.sh
        exit
	;;
3)
	echo "Es wurden keine Windowslogs gefunden" >>$LOGFILE
	./dmesg.sh
	dmesg2
        ./buildhtml.sh
        ./report.sh
        exit
	;;
esac

#Prüfe, ob dmesg erfolgreich geschrieben wurde
./dmesg.sh
dmesg2
echo "dmesg wurde erfolgreich vervollständigt" >>$LOGFILE

#Erzeugen der .html-Seite
./buildhtml.sh

#Archivieren aller Dateien und versenden der Email
./report.sh
#im uninetz noch einfügen und testen! skript ist fertig und funktionstüchtig



dmesg.sh

Code: Alles auswählen

#!/bin/bash

#Dieses Skript liest Systemmeldungen aus und schreibt sie in ein eigenes Logfile.

#Definitionen
LOGFILE='/tmp/Logfiles/tests/logdmesg.txt'
Datum=`date +%Y-%m-%d-%H-%M`
#Logfile erstellen, falls dieses nicht schon vorhanden ist
touch $LOGFILE

#Notiere Datum und gib dmesg aus, lösche danach dmesg
echo $Datum >> $LOGFILE
echo -e "Ausgabe von dmesg:\n" >> $LOGFILE
dmesg -c >> $LOGFILE
if [[ $? -eq 0 ]]
        then
		exit 0
        else
                exit 1
fi



Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von MSfree » 25.04.2016 16:11:36

Zeile 15:
function dmesg2 {
sollte

Code: Alles auswählen

dmesg2() {
sein, das Keyword "function" darf man auch weglassen.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 25.04.2016 16:14:10

Ich würd vermuten, da läuft eine Dash und keine Bash.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von TomL » 25.04.2016 18:15:16

Ich sehe zwar keinen Hinweis auf "dash", aber (imho) dafür Hinweise auf Syntaxfehler:

Anstatt

Code: Alles auswählen

function dmesg2 {
}
würde ich es mal so versuchen. Beispielfunktion:

Code: Alles auswählen

Trim()
{
  local var="$*"
  var="${var#"${var%%[![:space:]]*}"}"                  # remove leading whitespace characters "
  var="${var%"${var##*[![:space:]]}"}"                  # remove trailing whitespace characters "
  echo -n "$var"
}
Und des weiteren sehe ich eine potentielle Fehlerursache in solchen Statements:

Code: Alles auswählen

./dmesg.sh
                echo "dmesg geschrieben" >>$LOGFILE
                echo "dmesg nicht geschrieben" >>$LOGFILE
./hardware.sh
           echo "Hardwareinventory lshw abgeschlossen" >>$LOGFILE
           echo "Hardwareinventory lshw fehlgeschlagen" >>$LOGFILE
      ./dmesg.sh
      dmesg2
Da fehlt (imho vollständig) bei allen Statements die notwendige Pfadangabe, die m.E. unerläßlich ist, wenn es nicht eindeutig in der User-Bash läuft.... was heisst, wenn nicht wirklich gewährleistet ist, dass alle Environment-Vars ordentlich gesetzt sind. Das kann man ausschließen, wenn alle externen Befehle mit korrektem Pfad versehen sind.

Ausserdem würde ich solche Jobs sowieso nicht über die rc.local starten, sondern als systemd-service. Ich werde jetzt mal eben prüfen, ob systemd der rc.local überhaupt long-time-jobs gestattet..... das interessiert mich gerade auch mal selber.

Nachtrag: rc.local läuft auch mit längerem Job durch..... ich gestehe meine Überraschung... da hatte ich nicht mit gerechnet.

Hth

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 25.04.2016 19:15:25

TomL, weil das Script läuft, wie phill971 ja erzählt. Die Syntax ist perfekt in Ordnung:

Code: Alles auswählen

$ bash -c "function tunix { echo "hallo"; }; tunix"
hallo
$ dash -c "function tunix { echo "hallo"; }; tunix"
dash: 1: function: not found
dash: 1: Syntax error: ";" unexpected
$
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von TomL » 25.04.2016 19:32:15

NAB hat geschrieben:TomL, weil das Script läuft, wie phill971 ja erzählt. Die Syntax ist perfekt in Ordnung:

Code: Alles auswählen

$ bash -c "function tunix { echo "hallo"; }; tunix"
hallo
$ dash -c "function tunix { echo "hallo"; }; tunix"
dash: 1: function: not found
dash: 1: Syntax error: ";" unexpected
$
Ok, da gestehe ich mal Unwissenheit... :roll: ... wie kann das denn passieren, dass NICHT default die Bash läuft? Auf keinem einzigen meiner Jessie-PCs war das so.... weder mit xfce, noch mit lxde, kde oder ge'debootstrap't, immer Bash.... muss man da vorher von Hand dran drehen, um Bash zu deaktivieren?

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 26.04.2016 10:34:31

Danke für eure Hilfe!

Ich bin jetzt immerhin einen Schritt weiter. Es werden nun meine Skripte ausgeführt, allerdings ist die Abfrage des Rückgabewertes fehlerhaft.. Wird das ganze über rc.local ausgeführt, steht in meinem Log, dass die Tests fehlerhaft waren, obwohl sie ihre Funktion ausgeführt haben. Starte ich startdiagnosis.sh per Hand läuft es einwandfrei durch.

Weiterhin wirft der manuelle Aufruf von rc.local folgende Fehler aus:

/skripte/startdiagnosis.sh: 26: /skripte/startdiagnosis.sh: [[: not found
/skripte/hardware.sh 13: /skripte/hardware.sh: [[: not found
/skripte/startdiagnosis.sh: 35: /skripte/startdiagnosis.sh: [[: not found
/skripte/startdiagnosis.sh: 16: /skripte/startdiagnosis.sh: [[: not found
/skripte/startdiagnosis.sh: 45: /skripte/startdiagnosis.sh: [[: not found
/skripte/startdiagnosis.sh: 16: /skripte/startdiagnosis.sh: [[: not found

Ich werde hier noch wahnsinnig...


Anbei hardware.sh

Code: Alles auswählen

##!/bin/bash

#Dieses Skript führt ein Hardwareinventory durch und speichert die Ergebnisse als .html-Datei

#Definitionen
HTML='/tmp/Logfiles/tests/lshw.html'
Datum=`date +%Y-%m-%d-%H-%M`
#rausnehmen für final
>$HTML

#Führe Hardwareinventory durch und schreibe es in die html-Logdatei
lshw -html >$HTML
if [[ $? -eq 0 ]]
	then
		exit 0
	else
		exit 1
fi


TomL

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von TomL » 26.04.2016 10:59:41

Die rc.local startet die Dash, möglicherweise kommen daher die Fehlermeldungen. BTW, was ist das für eine Anweisung...?... was macht die?

Code: Alles auswählen

>$HTML
Da ich weiss, dass die Bash total zickig ist, was korrekte Syntax angeht.... vielleicht ist das auch der Fehler:

Code: Alles auswählen

##!/bin/bash
Versuchs mal so:

Code: Alles auswählen

#!/bin/bash

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 26.04.2016 11:35:30

TomL hat geschrieben:Die rc.local startet die Dash, möglicherweise kommen daher die Fehlermeldungen. BTW, was ist das für eine Anweisung...?... was macht die?

Code: Alles auswählen

>$HTML
Damit leere ich die Logdatei, da ich die Skripte lokal auf meinem Rechner teste und nicht jedes mal per Hand leeren will.

Da ich weiss, dass die Bash total zickig ist, was korrekte Syntax angeht.... vielleicht ist das auch der Fehler:

Code: Alles auswählen

##!/bin/bash
Versuchs mal so:

Code: Alles auswählen

#!/bin/bash
[/quote]

Das ist mir gar nicht aufgefallen, kann sein dass das der Fehler ist. Habe es berichtigt und werde jetzt mal weiter schauen.

Ein weiterer Punkt, der mir aufgefallen ist.. Habe einfach mal in den IF-Anweisungen der Skripte die zweiten eckigen Klammern weggemacht.. Damit gehts. Warum? Keine Ahnung :roll:

TomL

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von TomL » 26.04.2016 11:50:47

phill971 hat geschrieben:Damit leere ich die Logdatei, da ich die Skripte lokal auf meinem Rechner teste und nicht jedes mal per Hand leeren will.
Ich würde das entfernen, zum einen, weil ich solche "halben" Anweisungen als eher unästhetisch und undeutlich empfinde, auch wenn das funktioniert. Und zum zweiten ist das völlig unnötig, weil das nächste Statement sowieso ein neues Log anlegt:

Code: Alles auswählen

lshw -html >$HTML

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 26.04.2016 11:51:13

phill971 hat geschrieben:Warum? Keine Ahnung :roll:
Weil nur die Bash [[ versteht, du startest die Scripte aber mit irgendwas anderem.

Du leidest unter "Bashism". Jetzt stellst du auf "POSIX" um:
http://mywiki.wooledge.org/Bashism
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von TomL » 26.04.2016 12:00:02

phill971 hat geschrieben:Ein weiterer Punkt, der mir aufgefallen ist.. Habe einfach mal in den IF-Anweisungen der Skripte die zweiten eckigen Klammern weggemacht.. Damit gehts. Warum? Keine Ahnung
Dann muss Du explizit kontrollieren, ob das Ergebnis der If-Bedingung auch wirklich so ist, wie Du das erwartest. [] ist eine Referenz auf test.
http://ryanstutorials.net/bash-scriptin ... ements.php

Aber so ganz durchschaut, habe ich das auch noch nicht. Die meisten Bedingungen funktionieren mit Doppel-Klammer und mit Einzel-Klammer, aber einige wenige nur mit Doppel-Klammer.... und wie man eine Regel erkennt ist mir auch noch nicht klar.

Code: Alles auswählen

$ [[ "das ist ein test" =~ "test" ]] && echo "enthalten" || echo "nicht enthalten"
enthalten

$ [[ "das ist ein test" =~ "tests" ]] && echo "enthalten" || echo "nicht enthalten"
nicht enthalten

$ [ "das ist ein test" =~ "tests" ] && echo "enthalten" || echo "nicht enthalten"
bash: [: =~: Zweistelliger (binärer) Operator erwartet.
nicht enthalten

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 26.04.2016 12:22:46

TomL hat geschrieben:Dann muss Du explizit kontrollieren, ob das Ergebnis der If-Bedingung auch wirklich so ist,
Nein, muss er nicht. Das macht "if" für ihn.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von TomL » 26.04.2016 12:32:07

NAB hat geschrieben:
TomL hat geschrieben:Dann muss Du explizit kontrollieren, ob das Ergebnis der If-Bedingung auch wirklich so ist,
Nein, muss er nicht. Das macht "if" für ihn.
Doch, ich denke, dass muss er... dabei meine ich nicht permanent, sondern jetzt einmalig bei der Entwicklung. Mir ist das mehrfach aufgefallen, dass ein if-Ergebnis anders ausfallen kann (ohne das ich das jetzt adhoc reproduzieren könnte), wenn es die bash tut, oder test, oder regex. Und wenn ich das jetzt richtig kapiert habe, bedeutet ohne klammer "die bash machts", mit [] macht es "test", und mit [[]] wird zusätzlich "regex" verwendet. Ich denke schon, dass er einmalig prüfen muss, ob bei unterschiedlichen Fällen jeweils der richtige if-Codeblock abgearbeitet wird.

Gibt es irgendwas, wo man das mal verständlich nachlesen kann, wann ohne Klammer, wann einfach und wann doppelt? Dafür muss es doch Regeln oder sowas geben, anhand derer man das nachvollziehen kann. :roll:

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 26.04.2016 16:26:20

Ja, das Problem habe ich auch bemerkt.. Habe es verzweifelterweise mal ohne die doppelten Klammern probiert, also nur if [ bla ], damit geht es jetzt.
Wie ihr schon festgestellt habt, liegt es scheinbar daran, dass ich die Skripte als Bashskripte geschrieben habe, diese aber wohl nicht so ausgeführt werden.

Kann ich die Skripte als Bash ausführen, wenn ich diese mit

Code: Alles auswählen

bash /skripte/hardware.sh
ausführe?

Andere Frage.. Die Skripte werden jetzt soweit fast alle richtig ausgeführt. Nur mein Skript zum auslesen der Smartwerte macht Probleme.
Es soll die Smartwerte für jede Festplatte ausgeben, macht das aber nicht wenn das System frisch startet.. Starte ich Skript, Kontrollskript sowie rc.local im laufenden Betrieb führt er das Skript komplett aus und macht auch die Abfrage ohne Probleme. :roll:
Habe ich da jetzt auch wieder Bash-spezifisches drin, was so nicht funktioniert?
Anbei das Skript smart.sh

Code: Alles auswählen

#!/bin/bash

#Defintionen
DATUM=`date +%Y-%m-%d-%H-%M`
LOGFILE='/tmp/Logfiles/tests/logsmart.txt'
#Variable DISKS enthält alle angeschlossenen SATA-Festplatten
DISKS=$(ls /dev/sd[a-Z])

#Schreibe Datum in Logfile mit Zeilenumbruch
echo $DATUM >>$LOGFILE
echo -e "\n" >>$LOGFILE

#Führe für jede angeschlossene Festplatte aus:
for disk in $DISKS
do
	echo "Starte Selftest für $disk" >> $LOGFILE
	echo $DATUM >> $LOGFILE
#Starte short Test für jeweilige Festplatte
# auskommentiert um testzeit zu verkürzen!!!!!	smartctl -t short $disk >>$LOGFILE
#Zähler auf 0 setzen
	i=0

#Jede Festplatte hat 15Minuten Zeit, um den Smarttest abzuschließen. Sollte in dem Zeitraum die Überprüfung nicht abgeschlossen sein bricht das Skript ab
#Auf 7 gesetzt für testzwecke MUSS NOCH GEÄNDERT WERDEN!!
	while [ $i -lt 7 ]
	do
#Prüfe, ob der Status des Tests "completed" ist
		if smartctl -a $disk |grep "Self-test execution status:" |grep "completed" &> /dev/null;
#Wenn ja, gib Erfolgsmeldung sowie Smartwerte der jeweiligen Festplatte aus
		then
			echo -e "\nSelftest erfolgreich abgeschlossen\n" >>$LOGFILE
			smartctl -a $disk >>$LOGFILE
			echo -e "\n-------------------------------------\n" >>$LOGFILE
#Setze Zähler auf 35, um die Schleife zu unterbrechen
			i=35
#Wenn Status nicht completed, schlafe für 30Sekunden und zähle i+1
		else
			sleep 30
			let i=$i+1
			echo $i
		fi

#Sobald der Zähler zum letzten mal i eins hoch setzt und der Wert dreißig erreicht wird diese Bedingung wahr
		if [ $i = 7 ]
#Wenn wahr, wird eine Fehlermeldung ausgegeben
			then
				echo $DATUM >> $LOGFILE
				echo "TIMEOUT, Smarttest abgebrochen!" >> $LOGFILE
				exit 1
		fi
	done
done

#Haben alle verbauten Festplatten den Smarttest erfolgreich abgeschlossen wird eine Erfolgsmeldung ausgegeben und das Skript mit dem Exitcode 0 beendet.
echo "Smarttest erfolgreich abgeschlossen" >>$LOGFILE
exit 0

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 26.04.2016 17:03:00

phill971 hat geschrieben:Es soll die Smartwerte für jede Festplatte ausgeben, macht das aber nicht
Schreibt es "Mach ich nicht!" nach $LOGFILE?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 26.04.2016 18:58:34

Es schreibt alle anderen Ausgaben, die vorkommen in $LOGFILE. Nur nicht die Ausgabe von smartctl -a $disk.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 26.04.2016 19:30:26

Aha ... dann gibt's vermutlich genau da irgendeinen Fehler, den du nicht siehst, weil er Fehlermeldungen in der rc.local nicht melden kann.

Ändere die Zeile mal so:

Code: Alles auswählen

smartctl -a $disk >>$LOGFILE 2>&1
Das 2>&1 sorgt dafür, dass auch Fehlermeldungen in der Logdatei landen.

Edit: hab ne deutsche Erklärung gefunden:
https://wiki.ubuntuusers.de/Shell/Umleitungen/
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 27.04.2016 22:24:39

NAB hat geschrieben:

Code: Alles auswählen

smartctl -a $disk >>$LOGFILE 2>&1
Das 2>&1 sorgt dafür, dass auch Fehlermeldungen in der Logdatei landen.
Komisch, auch mit 2>&1 gibt es keine Meldung in der Logdatei. Es wird das Datum geschrieben, er sagt am Ende sogar "Smarttest erfolgreich abgeschlossen", zwischendrin sind zwei leere Zeilen.
Das ganze habe ich jetzt in der VM getestet, dort wirft smartctl allerdings bei händischen Aufruf eine Fehlermeldung aus, da die virtuellen Datenträger ja keine Smartunterstützung haben. Ganz merkwürdig...

Edit: Ich glaube das Problem liegt schon weiter Vorne. Er macht nicht mal

Code: Alles auswählen

echo "Starte Selftest für $disk" >> $LOGFILE
Dementsprechend scheint er die for-Schleife gar nicht auszuführen? Aber führe ich das Skript händisch aus passiert genau was ich von ihm möchte. Ist die for-Schleife zu Bashspezifisch und, womit auch immer rc.local ausgeführt wird, versteht sie nicht?

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 27.04.2016 23:15:47

Aha ... dann sieht's ja nun ganz anders aus. Dann schau dir doch die for-Schleife mal genauer an. Setze mal die mittlere Zeile ein:

Code: Alles auswählen

#Führe für jede angeschlossene Festplatte aus:
echo "for disk in $DISKS" >> $LOGFILE
for disk in $DISKS
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 28.04.2016 11:01:33

Das habe ich gemacht.

Es scheint ein Problem mit der Variable $DISKS zu sein, diese ist nämlich leer. Ausgabe:

Code: Alles auswählen

for disk in 

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von NAB » 28.04.2016 11:52:34

Aha ... da kommen wir der Sache ja näher. Das kann dann ja nur diese Zeile sein:
DISKS=$(ls /dev/sd[a-Z])
Und wenn ich das mal teste:

Code: Alles auswählen

$ dash -c "ls /dev/sd[a-Z]"
ls: cannot access /dev/sd[a-Z]: No such file or directory
Er nimmt "[a-Z] wörtlich, kann es also nicht expandieren. Das große Z ist auch völlig überflüssig - der Kernel vergibt hier nur kleine Buchstaben.

So mag er es aber:

Code: Alles auswählen

$ dash -c "ls /dev/sd[a-z]"
/dev/sda
Das "ls: cannot access /dev/sd[a-Z]: No such file or directory" siehst du nicht im Logfile, weil du dir stderr nicht ausgeben lässt. Das kannst du, wie erwähnt, mit einem 2>&1 erreichen.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

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

Re: rc.local führt beim Start meine Skripte nicht richtig au

Beitrag von phill971 » 28.04.2016 14:47:11

NAB hat geschrieben:Aha ... da kommen wir der Sache ja näher. Das kann dann ja nur diese Zeile sein:
DISKS=$(ls /dev/sd[a-Z])
Und wenn ich das mal teste:

Code: Alles auswählen

$ dash -c "ls /dev/sd[a-Z]"
ls: cannot access /dev/sd[a-Z]: No such file or directory
Er nimmt "[a-Z] wörtlich, kann es also nicht expandieren. Das große Z ist auch völlig überflüssig - der Kernel vergibt hier nur kleine Buchstaben.
YES! Das war das Problem, jetzt macht er was er soll.

Ganz großes DANKE an euch alle! :THX: :hail:

Antworten