Neutrino schmiert beim herunterfahren ab.

flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Neutrino schmiert beim herunterfahren ab.

Beitrag von flasher »

Hallo

Seit längerem habe ich es, dass Neutrino ab und an (eher häufig) nicht runterfährt.
Ich gehe im Menü auf Ausschalten und dann passiert eine Zeit lang nichts mehr.
Dann startet Neutrino auf einmal wieder. (Muted)

Glücklicherweise hatte ich gerade mal CuteCom an und musste da folgendes sehen:

Code: Alles auswählen

# terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Aborted
Neutrino exited with nonzero exit status, restarting...
Wenn ich danach nochmal "Ausschalte" funktioniert es meistens, kann mir darauf aber keinen Reim machen.
Log-Technisch gibt es bis auf das dort oben nichts zu sehen.

Gruß
jmittelst
Tuxboxer
Tuxboxer
Beiträge: 6044
Registriert: Montag 17. November 2003, 06:48

Beitrag von jmittelst »

Box zu spät runter gefahren. Ram war schon zu voll gemüllt und irgend ein Programm/Daemon hat sich dann beim Shutdown weg gehängt. Ist quasi wie ein Bluescreen bei Windows, bei dem eingestellt ist, das Windows nach Bluescreen neu gebootet wird. Oder aber Deine Shutdown-Skripte arbeiten nicht sauber. Aber da wir keine Infos zum Image etc. haben...

cu
Jens
PandinusImperator
Interessierter
Interessierter
Beiträge: 32
Registriert: Dienstag 23. Oktober 2007, 09:26

Beitrag von PandinusImperator »

Pack doch mal deine start_neutrino aus dem Verzeichnis "etc" hier rein.
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Beitrag von flasher »

Das Image ist ein ganz normal selbstgebackenes.

Die start_neutrino:

Code: Alles auswählen

date -s 010101001970

sectionsd
timerd
camd2
if [ -e /var/etc/.pmt_update ] ; then
	zapit -u
else
	zapit
fi
controld
nhttpd

until neutrino -f -u ; do
    echo "Neutrino exited with nonzero exit status, restarting..."
    pidof sectionsd >/dev/null || sectionsd
    pidof timerd    >/dev/null || timerd
    pidof camd2     >/dev/null || camd2
    pidof zapit     >/dev/null || zapit
    pidof controld  >/dev/null || controld
    pidof nhttpd    >/dev/null || nhttpd
done

pzapit -kill

[ -e /tmp/tuxmaild.pid ] && kill -TERM $( cat /tmp/tuxmaild.pid )
[ -e /tmp/tuxcald.pid ] && kill -TERM $( cat /tmp/tuxcald.pid )
[ -e /var/run/automount.pid ] && kill -TERM $( cat /var/run/automount.pid )

waittime=40
while expr $waittime != 0 > /dev/null
do
	if pidof zapit > /dev/null; then echo "Waiting for zapit (max. $waittime seconds)"
		else break;
	fi
	waittime=`expr $waittime - 1`
	sleep 1
done

waittime=10
while expr $waittime != 0 > /dev/null
do
	if pidof controld > /dev/null; then echo "Waiting for controld (max. $waittime seconds)"
	elif pidof timerd > /dev/null; then echo "Waiting for timerd (max. $waittime seconds)"
	else break;
	fi
waittime=`expr $waittime - 1`
sleep 1
done

if [ -e /tmp/.reboot ] ; then
    reboot
else
    halt
fi
Wenn man nun die Meldung auf der Console beachtet, dann ensteht der Fehler ja in der Schleife hier. Demnach kann es also nur an Neutrino liegen, da die Meldung nur kommt wenn Neutrino keinen sauberen Rückgabewert liefert.

Code: Alles auswählen

until neutrino -f -u ; do
    echo "Neutrino exited with nonzero exit status, restarting..."
    pidof sectionsd >/dev/null || sectionsd
    pidof timerd    >/dev/null || timerd
    pidof camd2     >/dev/null || camd2
    pidof zapit     >/dev/null || zapit
    pidof controld  >/dev/null || controld
    pidof nhttpd    >/dev/null || nhttpd
done 
Jetzt frage ich mich natürlich welches Programm den Speichern vollhaut und Neutrino desshalb nicht ordentlich beendet werden kann.

Meine Vermutung geht nun in Richtung SectionsD.
Da ich ja geschrieben hatte, dass Neutrino danach wieder Muted startet, an Stelle das die Box ausgeht, komme ich durch diesen Abschnitt auf die Vermutung:

Code: Alles auswählen

			if (frameBuffer != NULL)
				delete frameBuffer;

			if (g_settings.epg_dir.length() != 0) {
				waitforshutdown = true;
				AudioMute(true);
				g_Sectionsd->writeSI2XML(g_settings.epg_dir.c_str());
			}
			else {
Das ist die einzige Stelle in ExitRun() wo Audio ausgeschaltet wird.

Mag es an den ganzen XML Files liegen die Sectiond da schreiben will?
Kann es sein, dass Sectionsd den Speicher mit den Daten vollhaut?

Übrigens würde mir noch eine Option gefallen mit der man das Schreiben des EPG-Cache abstellen kann.
Da ich weder eine HDD noch eine SD habe ist diese Option für mich total überflüssig. Zur Zeit wird alles in /tmp geschrieben.
Da /tmp beim Shutdown eh weg ist braucht sich SectionsD auch nicht damit beschäftigen die Dateien zu schreiben. Dies würde doch auch einen kleinen Geschwindigkeitszuwachs beim ausschalten bedeuten.


Gruß
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

Zur Zeit wird alles in /tmp geschrieben.
das ist kaka :-)

sieh mal zu, daß dein

Code: Alles auswählen

if (g_settings.epg_dir.length() != 0) { 
nicht zuschlägt -> epg_dir nicht konfiguriert ist.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

flasher hat geschrieben:

Code: Alles auswählen

			if (frameBuffer != NULL)
				delete frameBuffer;

			if (g_settings.epg_dir.length() != 0) {
				waitforshutdown = true;
				AudioMute(true);
				g_Sectionsd->writeSI2XML(g_settings.epg_dir.c_str());
			}
			else {
Das ist die einzige Stelle in ExitRun() wo Audio ausgeschaltet wird.

Mag es an den ganzen XML Files liegen die Sectiond da schreiben will?
Kann es sein, dass Sectionsd den Speicher mit den Daten vollhaut?
Wenn du nach /tmp/ schreibst, dann schon :-) /tmp ist tmpfs -> liegt im RAM.
Übrigens würde mir noch eine Option gefallen mit der man das Schreiben des EPG-Cache abstellen kann.
schau dir den zitierten Code nochmal an, die gibt's :-)
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Beitrag von flasher »

Hi

Ich habe mich vieleicht beim EPG_DIR nicht ganz deutlich ausgedrückt.
Das steht nun auf /tmp. Das bekommt man doch per Menü nicht mehr raus.
Wenn ich auf den Menüpunkt dafür gehe, dann kann ich nur einen neuen Ordner auswählen aber den vorhanden nicht löschen.

Und im Zuge der Usability kann es ja nicht sein, dass man in dem Fall per FTP/Telnet auf die Box muss um in der neutrino.conf das zu löschen.
Und nach dem Löschen kann man die Box dann auch nicht normal runterfahren weil der Wert wieder in die conf geschrieben würde.

In meinen Augen ist es dann also nicht einfach mal so abschaltbar.
Oder gibt es irgendwo die Möglichkeit den Pfad aus den Einstellungen zu bekommen?

Gruß
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Bei der Pfadauswahl auf "..", bis du ganz oben bist, dann nochmal auf ".." OK drücken -> g_settings.epg_dir.length() == 0

:-)
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Beitrag von flasher »

Na dann :)