AKR68
Anmeldungsdatum: 4. Februar 2017
Beiträge: Zähle...
Wohnort: Niedersachsen
|
Hallo zusammen! Es kommt in 24 Stunden 2 bis 3 mal vor, dass sich das Script jedesmal bei der Abarbeitung von
"avconv" aufhängt. Ansonsten läuft das Script tadellos und ohne Fehlermeldung. Meine Idee ist, dass das Script als erstes eine Schleife durchlaufen soll, welche nach 60 Sekunden noch nicht bis zur letzten Zeile abgearbeitet worden ist, den Raspberry Pi neustarten lässt. Das Script starten mit:
bash /etc/privat/snapshot | #!/bin/bash
end=$((SECONDS+60))
while [ $SECONDS -lt $end ]; do
sudo /sbin/shutdown -r now
:
done # Wenn nach 60 Sekunden das Script NICHT neu aufgerufen wurde, dann ein Neustart durchführen
avconv -rtsp_transport tcp ... # Auszuführendes Programm
bash /etc/privat/snapshot # Script zum wiederholten mal starten
|
Linie 3 läuft ab und rebootet, wenn Linie 7 hängt und 8 nicht mehr ausgeführt werden kann. Natürlich funktioniert das Script SO nicht. Es soll nur veranschaulichen, wie meine Idee dazu währe. Ich hoffe, ich konnte es Euch einigermaßen verständlich machen. Ich habe den "Raspberry Pi 3 Model B" erst seid 2 Wochen und bin noch ein Noob im Programieren. Für Eure Hilfe währe ich sehr dankbar.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13212
|
AKR68 schrieb: Hallo zusammen!
Herzlich willkommen hier im Forum!
Es kommt in 24 Stunden 2 bis 3 mal vor, dass sich das Script jedesmal bei der Abarbeitung von
"avconv" aufhängt.
Soweit kommt es gar nicht, denn vorher hat es bereits den Rechner gebootet.
Ansonsten läuft das Script tadellos und ohne Fehlermeldung.
Nein. Da sind einige Probleme in Deinem Skript vorhanden, die Du möglicherweise nicht siehst (s.u.).
Meine Idee ist, dass das Script als erstes eine Schleife durchlaufen soll, welche nach 60 Sekunden
noch nicht bis zur letzten Zeile abgearbeitet worden ist, den Raspberry Pi neustarten lässt.
Wie bitte? Kannst Du bitte noch einmal erläutern, was Du eigentlich erreichen willst?
Das Script starten mit:
bash /etc/privat/snapshot | #!/bin/bash
end=$((SECONDS+60))
while [ $SECONDS -lt $end ]; do
sudo /sbin/shutdown -r now
:
done # Wenn nach 60 Sekunden das Script NICHT neu aufgerufen wurde, dann ein Neustart durchführen
avconv -rtsp_transport tcp ... # Auszuführendes Programm
bash /etc/privat/snapshot # Script zum wiederholten mal starten
|
Zu den Punkten, die nicht gut sind:
Zeile 5 ist schlicht überflüssig. Zeile 8 führt dazu, dass nach und nach mehr Prozesse verbraucht werden (zumindest, wenn die bash nicht die gleiche Optimierung macht wie die dash und für das letzte Kommando einen neuen Prozess startet). Da musst Du mindestens ein exec voran stellen, aber noch besser, den rekursiven Aufruf durch eine äußere Schleife ersetzen. Das Skript bootet bei jedem Aufruf, weil es nämlich deutlich weniger als 60 Sekunden von Zeile 2 zu Zeile 3 benötigt! Damit wird der Schleifenrumpf ausgeführt und Dein Rechner bootet.
Linie 3 läuft ab und rebootet, wenn Linie 7 hängt und 8 nicht mehr ausgeführt werden kann.
Nein. Das ist keine zutreffende Beschreibung des Ist-Zustandes.
Natürlich funktioniert das Script SO nicht. Es soll nur veranschaulichen, wie meine Idee dazu währe.
Das ist natürlich schwierig, an einem Skript, das nicht funktioniert wie beabsichtigt, Deine Absicht abzulesen. Beschreib lieber mit Worten, was Du eigentlich erreichen möchtest. So, wie das Skript im Moment aufgesetzt ist, wird es bei jedem Start neu booten.
Ich hoffe, ich konnte es Euch einigermaßen verständlich machen.
Ich orakele mal, dass Du einen Reboot erzwingen willst, wenn sich avconv aufhängt. Die Frage ist, wie man das Aufhängen erkennt. Läuft der Prozess länger als eine bestimmte Zeit? Wie macht sich das bemerkbar? Erst, wenn man das weiß, kann man bestimmen, wie Du das Skript aufsetzen musst, damit es das tut, was es soll. Außerdem: reicht vielleicht auch ein Neustart von avconv anstatt gleich den ganzen Rechner neu zu starten?
|
AKR68
(Themenstarter)
Anmeldungsdatum: 4. Februar 2017
Beiträge: 37
Wohnort: Niedersachsen
|
Hallo rklm!
Ich orakele mal, dass Du einen Reboot erzwingen willst, wenn sich avconv aufhängt.
Genau so ist es. Ich poste mal das aktuelle Bash, welcher beim hochfahren mit startet (rc.local):
1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
sleep 10
while true
do
url="rtsp://111.111.111.11:554/user=xxx_password=xxx_channel=1_stream=0.sdp"
avconv -rtsp_transport tcp -i $url -an -f image2 -vframes 1 -pix_fmt yuvj420p -s 1280x720 -vf fps=5/10 /var/www/html/webcambild.jpg
sudo cp /var/www/html/webcambild.jpg /var/www/html/archiv
today=`date '+%d-%m-%Y__%H-%M-%S'`;
sudo mv /var/www/html/archiv/webcambild.jpg /var/www/html/archiv/$today.jpg
find /var/www/html/archiv/ -name '*.jpg' -mtime +2 -delete
sleep 3
done
|
Läuft wie gesagt Prima, bis er sich bei Zeile 6 aufhängt, d.h. er bleibt einfach in der Kommandozeile stehen, bis ich dann ein nano reboot gebe (Über Putty), weil ich direkt keine Befehle mehr eingeben kann. Ich arbeite nicht im Desktopmodus, sondern fahre direkt im Kommandozeilenmodus (Cli) hoch.
Kannst Du bitte noch einmal erläutern, was Du eigentlich erreichen willst?
Ich möchte erreichen, dass wenn das Script sich wiedermal bei "avconv" aufhängt, der Pi neu startet. Ich hoffe, Du bekommst kein Schreck bei dem Code.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Hallo, kennst du das timeout Kommando? Damit kannst du einen Befehl nur eine bestimmte Zeit laufen lassen. Siehe man timeout . Falls sich der Pi wirklich komplett aufhängen sollte kannst du den eingebauten Hardware-Watchdog verwenden. Dieser muss alle x Sekunden eine „ich bin noch am leben“-Signal erhalten ansonsten wird dein Pi neu gestartet. Unabhängig davon wie sehr du das System auch abgeschossen hast da das Ding wirklich eine dezidierte Komponente auf dem SoC ist. Abgesehen von den 2 Vorschlägen wäre es natürlich auch ratsam einfach irgendwie zu verhindern das der Befehl sich aufhängt. Oder zumindest herauszufinden warum er das macht.
|
AKR68
(Themenstarter)
Anmeldungsdatum: 4. Februar 2017
Beiträge: 37
Wohnort: Niedersachsen
|
Hallo und Guten Morgen senden9!
kennst du das timeout Kommando?
Nein, bislang nur in Javascript. Das hört sich sehr interessant an, werde mich mal schlau machen. Ich verstehe immer noch nicht, wie er sich immer an dieser Zeile aufhängt: (Inzwischen diesen Zeilencode verbessert!)
| avconv -rtsp_transport tcp -i $url -vframes 1 -an -r 25 -s 1280x720 /var/www/html/webcambild.jpg
|
Vorher alle 3-4 Sekunden ein Bild, mit diesen alle 2-3 Sekunden ein Bild. Temperatur auch 3 Grad weniger. Das kann doch so nicht falsch sein. Ich schau jetzt mal nach Deiner "man timeout" Methode, ob und wie man diese einbaut. Vielen Dank dafür! 👍 Also, bis dann!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13212
|
AKR68 schrieb:
Ich verstehe immer noch nicht, wie er sich immer an dieser Zeile aufhängt: (Inzwischen diesen Zeilencode verbessert!)
Du solltest mindestens einmal damit anfangen, dass Du die Variable $url quotest.
| avconv -rtsp_transport tcp -i $url -vframes 1 -an -r 25 -s 1280x720 /var/www/html/webcambild.jpg
|
Vorher alle 3-4 Sekunden ein Bild, mit diesen alle 2-3 Sekunden ein Bild. Temperatur auch 3 Grad weniger.
Es ist immer noch die Frage, wie sich das Aufhängen bemerkbar macht. Ist es, wenn der Prozess länger als x Sekunden läuft? In dem Fall würde timeout o.ä. helfen. Oder soll er länger laufen und hört dann auf irgendetwas bestimmtes zu tun? Was macht denn diese Kommandozeile? Lädt die genau ein Bild herunter und speichert es in der Datei /var/www/html/webcambild.jpg? Dann kann man etwas mit timeout machen, wenn der Rechner nicht komplett gebootet werden muss.
Das kann doch so nicht falsch sein.
Das hängt davon ab. ☺ Man muss halt das Ziel kennen, um beurteilen zu können, ob es erreicht wurde.
|
AKR68
(Themenstarter)
Anmeldungsdatum: 4. Februar 2017
Beiträge: 37
Wohnort: Niedersachsen
|
Hallo rklm! Du solltest mindestens einmal damit anfangen, dass Du die Variable $url quotest.
Die habe ich nicht verändert und hier in Zeile 5 schon gezeigt (siehe den unteren Link). Ganz normaler rtsp-Stream. https://forum.ubuntuusers.de/topic/raspberry-pi-neustarten-wenn-script-sich-aufha/#post-8790588 -
Ist es, wenn der Prozess länger als x Sekunden läuft? In dem Fall würde timeout o.ä. helfen.
Das Script macht genau das, was es soll! Hundertemal! Aber irgendwann, ganz plötzlich hört er auf und bleibt dann immer an der selben stelle stehen, wo der Prozess avconv vergeblich versucht einen frame vom Stream zu holen um ihn zu encoden. (Cursor blinkt nur noch) -
Lädt die genau ein Bild herunter und speichert es in der Datei /var/www/html/webcambild.jpg?
Genau! - Ein einzelnes Bild von dem Stream (Variable $url) wird dorthin abgelegt. -
Man muss halt das Ziel kennen, um beurteilen zu können, ob es erreicht wurde.
Wie schon gesagt: Hundertemal! wurde das Ziel erreicht. Schleife für Schleife. Und dann .............Stillstand!!! Eine Hoffnung wäre vielleicht timeout, aber wie und wo, habe ich noch nicht herausgefunden. Bin für jede Hilfe dankbar!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13212
|
Also, erst mal räumen wir etwas auf:
Einrückungen hinzugefügt. Die Variablen kann man außerhalb der Schleife definieren. Den sleep kann man ruhig in den Schleifenkopf packen - wenn der nämlich scheitert, kann man annehmen, dass etwas schief geht oder der Rechner herunter gefahren wird. Quoten von $url Eine extra Variable für das Zielverzeichnis - macht die Sache lesbarer und man erkennt leichter, welches dieselbe Datei ist. Die irreführend benannte Variable für den Zeitstempel entfernt. Den mv kann man sich sparen, wenn gleich mit dem richtigen Namen an die richtige Stelle kopiert wird. Backticks ersetzt durch die modernere und lesbarere Form $(...) . bash durch sh ersetzt, die völlig ausreicht und bei Skripten normalerweise schneller ist (minimal).
Aussagekräftiger Kommentar hinzugefügt. Das Kopieren nur vornehmen, wenn avconv erfolgreich ist.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/sh
# Dieses Skript holt alle drei Sekunden ein Bild ab, veröffentlicht es und
# sichert es im Archiv mit Zeitstempel im Namen. Danach werden alle Bilder
# älter als zwei Tage gelöscht.
url="rtsp://111.111.111.11:554/user=xxx_password=xxx_channel=1_stream=0.sdp"
file=/var/www/html/webcambild.jpg
while sleep 3; do
avconv -rtsp_transport tcp -i "$url" -an -f image2 -vframes 1 -pix_fmt yuvj420p -s 1280x720 -vf fps=5/10 "$file" \
&& sudo cp "$file" /var/www/html/archiv/$(date '+%d-%m-%Y__%H-%M-%S').jpg
find /var/www/html/archiv/ -name '*.jpg' -mtime +2 -delete
done
|
Jetzt bauen wir noch timeout mit der Annahme ein, dass avconv im Normalfall nicht mehr als 5 Sekunden braucht: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/sh
# Dieses Skript holt alle drei Sekunden ein Bild ab, veröffentlicht es und
# sichert es im Archiv mit Zeitstempel im Namen. Danach werden alle Bilder
# älter als zwei Tage gelöscht.
url="rtsp://111.111.111.11:554/user=xxx_password=xxx_channel=1_stream=0.sdp"
file=/var/www/html/webcambild.jpg
while sleep 3; do
timeout 5s avconv -rtsp_transport tcp -i "$url" -an -f image2 -vframes 1 -pix_fmt yuvj420p -s 1280x720 -vf fps=5/10 "$file" \
&& sudo cp "$file" /var/www/html/archiv/$(date '+%d-%m-%Y__%H-%M-%S').jpg
find /var/www/html/archiv/ -name '*.jpg' -mtime +2 -delete
done
|
Nur, wenn avconv erfolgreich ist (d.h. weder selbst einen Fehler meldet noch durch timeout abgebrochen wurde) wollen wir das Bild ins Archiv kopieren.
|
AKR68
(Themenstarter)
Anmeldungsdatum: 4. Februar 2017
Beiträge: 37
Wohnort: Niedersachsen
|
Hallo rklm! Ich habe den zweiten Code genauso übernommen. Gab dann allerdings eine Fehlermeldung, dass er die zu kopierende Datei nicht finden konnte. War ja auch klar, denn avconv hatte auch keine erstellt. Erst nachdem ich aus der Zeile 11 -vf fps=5/10 entfernt hatte, wurde eine JPG-Datei erstellt. Bis jetzt macht er seine Arbeit fehlerfrei. - Habe noch ein paar Fragen: -vf fps=5/10 Bedeutet das nicht "Zwei Bilder in der Sekunde"? #!/bin/sh und #!/bin/bash Sind, wenn eh Ausführbar, nur Makeup. - Ich schau nochmal auf dem Monitor, ............jep, läuft noch!!! 👍 Hoffentlich läuft der Pi jetzt zuverlässig und ohne Fehler so weiter. Melde mich auf jedenfall spätestens morgen hier wieder. Vielen Dank schon mal für Deine Bemühungen. 👍 👍 👍
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
AKR68 schrieb: #!/bin/sh und #!/bin/bash Sind, wenn eh Ausführbar, nur Makeup.
Nein. Das das ist die sogenannte Shebang. Probiere da mal so etwas wie #!/bin/cat hin zu schreiben & staune. Diese Zeile gibt den Interpreter für dein Skript an.
|
AKR68
(Themenstarter)
Anmeldungsdatum: 4. Februar 2017
Beiträge: 37
Wohnort: Niedersachsen
|
Hallo senden9! Shebang also. Danke für die Erklärung und die verlinkte Seite. 😉 Schon klasse, dieses Forum. 👍 Und schöne Grüße aus Niedersachsen nach Österreich
|
AKR68
(Themenstarter)
Anmeldungsdatum: 4. Februar 2017
Beiträge: 37
Wohnort: Niedersachsen
|
Hallo rklm und senden9! Hier die versprochene Rückmeldung. Das Script läuft jetzt zuverlässig seid mehr als 20 Stunden. Allerdings funktionierte die Löschfunktion nicht: | find /var/www/html/archiv/ -name '*.jpg' -mtime +2 -delete
|
Hatte z.B. immer noch Bilder vom 03.02.2017 im "archiv" - Ordner. Habe mich dann noch einmal im Internet kundig gemacht und rausbekommen, dass nach der Verzeichnisangabe "/var/www/html/archiv/" ein Forward Slash zuviel war. Jetzt läuft alles Problemlos. Vielen Dank noch einmal für Eure Hilfe. 👍 👍
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13212
|
AKR68 schrieb:
Das Script läuft jetzt zuverlässig seid mehr als 20 Stunden.
Prima!
Allerdings funktionierte die Löschfunktion nicht: | find /var/www/html/archiv/ -name '*.jpg' -mtime +2 -delete
|
Hatte z.B. immer noch Bilder vom 03.02.2017 im "archiv" - Ordner. Habe mich dann noch einmal im Internet kundig gemacht und rausbekommen, dass nach der Verzeichnisangabe "/var/www/html/archiv/" ein Forward Slash zuviel war. Jetzt läuft alles Problemlos.
Das kann es nicht sein, denn der Slash macht keinen Unterschied. Im Gegenteil: wenn /var/www/html/archiv ein Symlink ist, dann braucht man den Slash oder muss die Option -follow verwenden, damit er die Dateien findet. Ich tippe, dass Du -mtime falsch verstanden hast (siehe Manpage von find ).
Vielen Dank noch einmal für Eure Hilfe. 👍 👍
Bitteschön!
|