shell script und timeing

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
michaa7
Beiträge: 3573
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

shell script und timeing

Beitrag von michaa7 » 08.01.2021 21:42:00

Gibt es in shell scrips ausser sleep noch andere Möglichkeiten Ereignisse/Kommandos ***zeitbezogen*** zu steuern? Gibt es irgendeine timeline Funktion?
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
Forumsumfrage: Welche debianartige Distribution / SubDistri nutzt du?
Und wenn ihr textet das Abstimmen im Formular nicht vergessen ...

Benutzeravatar
Livingston
Beiträge: 521
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: shell script und timeing

Beitrag von Livingston » 10.01.2021 15:13:06

Sowas wie Debianat?
Script nach Uhrzeit ausführen. Man könnte dann im laufenden Script die nächste Uhrzeit setzen.
$ <- user
# <- root. Wer meint, da müsse $sudo stehen, mache das bitte mit seinem (Ge-)wissen aus - aber nicht mit mir.

michaa7
Beiträge: 3573
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: shell script und timeing

Beitrag von michaa7 » 10.01.2021 18:44:45

Nein. Es geht nicht darum wann das script ausgeführt wird. Sondern darum wie

1) einfach, übersichtlich und leicht editierbar die zeitliche Abfolge definiert werden kann

und

2) wie akkurat (in Bruchteilen von Sekunden!) dies ausgeführt wird.

Punkt 1 hat dabei für mich wesentlich geringere Wichtigkeit, aber vermutlich gibt es da auch einen Zusammenhang zu Punkt 2.

Mein script (darauf angepasst ein bestimmtes Musikvideo mit 2 Takten optisch unterstütztem Vorlauf zu starten)
sleep 2.000
echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" &
sleep 0.475
echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" &
sleep 0.475
echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" &
sleep 0.307
playerctl play & # vlc wartet bereits mit geladenem video im non-autoplay modus
sleep 0.168
echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" &
sleep 0.475
echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" &
sleep 0.475
echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" &
sleep 0.475
echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" &
sleep 1.424
echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" &
sleep 1.424
echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" &
sleep 1.424


Wichtig: Ich bin absoluter shellscript Anfänger. Vielleicht gibt es ganz einfache Maßnahmen um den zeitlichen Ablauf geschmeidiger und vor allem akkurater zu machen. Ich habe davon schlichtweg (noch) keine Ahnung.

Es geht ***nicht*** um ein einzelnes Video. Es geht darum hier Arbeit zu investieren, um zukünftig jedes beliebige Musikvideo *ohne Vorbearbeitung dieses Videos!!!* scriptgesteuert so zu starten dass man eben eine optische Tempovorgabe hat und dann den Einsatz sieht. (In aller Kürze: die drei Zeiten Startzeit des Videos, Schlag1_Takt-x, Schlag-1_Takt-y bekomme ich mit "cnee", die Um- und Rückrechnung geschieht derzeit noch mit calc, das Ergebnis ist dieses Script.)

Das erfreuliche an dem ganzen Gewusel ist, dass es es "im Prinzip" so funktioniert. Das störende ist noch, dass das äussere timing (die mit "sleep beginnenden zeilen) zwar rechnerisch stimmt, dies im Ergebnis jedoch hakelig und bislang noch unstimmig rüberkommt.
Die genauen Ursachen sind mir noch unklar. Meine Vermutung ist, dass die serielle Abarbeitung eben nicht so glatt abläuft, daran das Abkoppeln (&) der echo-Zeilen nichts ändert, die sleeps in den echo-Zeilen das äussere timeing doch beeinflussen (dann müsste ich das äusser timeing umrechnen, was die ganze Sache unhandlich machen würde, zumal das timing der blinks für das feeling wichtig ist) und die Ausführungszeiten selbst auch noch eine Rollen spielen.

Was ich also such ist ein Programm, welches es erlauben würde diese timeline
0,000
2,000 echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" #Taktschlag -2.1
2,475 echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" #Taktschlag -2.2
2,949 echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" #Taktschlag -2.3
3,256 playerctl play & # vlc wartet bereits mit geladenem video im non-autoplay modus
3,424 echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" #Taktschlag -1.1
3,899 echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" #Taktschlag -1.2
4,373 echo -e "\e[?5h" && sleep 0.1s && echo -e "\e[?5l" #Taktschlag -1.3
4,848 echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" #Taktschlag 1.1
6,272 echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" #Taktschlag 2.1
7,696 echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" #Taktschlag 3.1
genau entlang der timeline auszuführen ohne sich im Zeitlauf von der Ausführungszeit und/oder den enthaltenen sleeps beeinflussen zu lassen.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
Forumsumfrage: Welche debianartige Distribution / SubDistri nutzt du?
Und wenn ihr textet das Abstimmen im Formular nicht vergessen ...

Benutzeravatar
Livingston
Beiträge: 521
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: shell script und timeing

Beitrag von Livingston » 10.01.2021 22:23:12

Bin da leider auch nicht fit drin, aber das Stichwort heißt "real time".
Problem in der Bash ist, dass Du Dich nicht darauf verlassen kannst, dass es just in time abgerödelt wird. Irgendwelche Hintergrundprozesse wollen auf einmal Priorität haben, Netzwerkstau wird abgearbeitet, irgendwo läuft ein Puffer voll und will was auf die Festplatte schieben... nur mal so als Auswahl.
RT-(realtime-)Prozesse werden dagegen pünktlich und innerhalb einer definierten Latenz abgearbeitet. Soweit ich weiß (bitte korrigieren, wenn falsch) brauchst Du dafür den RT-Kernel linux-image-...-rt-amd64 + spezielle Pakete, die ich aber nicht kenne.
$ <- user
# <- root. Wer meint, da müsse $sudo stehen, mache das bitte mit seinem (Ge-)wissen aus - aber nicht mit mir.

michaa7
Beiträge: 3573
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: shell script und timeing

Beitrag von michaa7 » 10.01.2021 23:05:55

Ohne das thema RT irgendwie in Frage stellen zu wollen, wenn das script läuft, läuft nichts anderes. Dass dennoch mal irgend ein HG-Task querschiessen könnte mag sein, und dann passiert das eben. Aber im Regelfall ist dieser Computer nur dafür da und keine anderen Programme wären aktiv.

Und bevor ein RT-Kernel notwendig würde müsste ich erstmal verstanden haben, wie man ein Command per script so ausführen läßt, dass es die gewünschte timeline nicht beeinflußt.

In meinen beispiel ist ja vlc bereits offen und im wartemodus.
Eine konsole in der ich das script öffen ist auch auf, darin "feuert" das echo sofort.
Schwieriger ist schon das "playerctl". Ich gehe davon aus dass dieses Programm zumindest beim ersten Scriptaufruf nicht im Speicher liegt, zudem erst den richtigen player, in meinem Fall VLC, suchen muss (letzteres ließe sich jedoch möglicherweise etwas gezielter vorauswählen). Ob ersteres bei folgenden Scriptaufrufen schneller geht müsste man sehen ... und vor allem testen. Dazu bräuchte man ein Ausführungs- log im ms Bereich.

Geht das?


Vielleicht meldet sich ja doch noch einer der Script Spezialisten ...
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
Forumsumfrage: Welche debianartige Distribution / SubDistri nutzt du?
Und wenn ihr textet das Abstimmen im Formular nicht vergessen ...

Benutzeravatar
Tintom
Moderator
Beiträge: 2301
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: shell script und timeing

Beitrag von Tintom » 11.01.2021 07:30:43

Steht das Problem im Zusammenhang mit deinen Threads viewtopic.php?f=28&t=179864 und viewtopic.php?f=28&t=179865?

michaa7
Beiträge: 3573
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: shell script und timeing

Beitrag von michaa7 » 11.01.2021 14:07:56

Nun, das Script ist das erste, einzige und selbe. In soweit: Ja.

Aber meine Fragestellungen sind eben jeweils andere. Daher neue Threads ... falls das die Zielrichtung deiner Frage war.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
Forumsumfrage: Welche debianartige Distribution / SubDistri nutzt du?
Und wenn ihr textet das Abstimmen im Formular nicht vergessen ...

Benutzeravatar
Livingston
Beiträge: 521
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: shell script und timing

Beitrag von Livingston » 11.01.2021 16:27:14

Der Knackpunkt bei dieser Fragestellung und den beiden anderen Threads sind die Latenzen, die zwangsläufig entstehen.
Das hat mehrere Gründe:

1. In einem shell-script muss für jeden einzelnen Befehl ein neuer Prozess erstellt werden. Das gehört zu den aufwendigsten Abläufen, die es überhaupt gibt. Im Hintergrund wird dazu Speicher zur Verfügung gestellt, evtl. umsortiert und freigeräumt, Umgebungsvariablen werden kopiert...
2. Was ich oben schon angesprochen habe, ist nicht ohne. Tipp mal ps -ef ein und staune, was allein der Kernel an Prozessen bereit hält (alles unter PPID 2). Ist zwar nicht alles gleichzeitig aktiv, bekommt aber 'ne hohe Priorität, wenn's gebraucht wird, und zerschlägt sauber Dein Timing.

Optimal für Deine Belange wäre ein einzelner Prozess (evtl. mit mehreren Threads), der selbst die sleep-Funktion des Kernels aufruft. Siehe auch man 2 usleep und man 2 nanosleep.
Das heißt aber auch, dass einfaches Skripten dann nicht mehr ausreicht. Die eben genannten Funktionen bauen auf der klassischen Programmierschnittstelle in C auf, die gibt es aber auch für andere und leicht verdaulichere Sprachen.

Tut mir leid, aber ich fürchte, für so genaues Timing, wie Du es Dir wünschst, ist die shell einfach nicht geeignet.
$ <- user
# <- root. Wer meint, da müsse $sudo stehen, mache das bitte mit seinem (Ge-)wissen aus - aber nicht mit mir.

michaa7
Beiträge: 3573
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: shell script und timeing

Beitrag von michaa7 » 11.01.2021 18:45:18

Danke dass du dich da gedanklich so reinhängst.

Ich mache da heute noch ein paar Tests, insbesondere denke ich nun, dass meine Annahme wie

Code: Alles auswählen

echo -e "\e[?5h" && sleep 0.5s && echo -e "\e[?5l" &
abgearbeitet wird falsch war (ich dachte in meiner anfänglichen Uninformiertheit, dass das hier eingeschlossene sleep wegen des Schluß-& *getrennt* von dem was ich "äussere timeline" genannt habe verarbeitet würde ... was wohl einen falsche Annahme war.

Falls das doch noch zu einem akzeptablen Ergebniss führt, ok, falls nicht, dann wäre "C" ganz sicher keine realistische, keine für mich praktikable Alternative weil mich das x-fach überfordern würde und vom Zeitaufwand und der Steilheit der Lernkurve für mich nicht ansatzweise in Sichtweite ist.

Falls jedoch eine andere Scriptsprache für den Zweck angemessene Verarbeitungszeiten bietet und jemand mit wirklich Ahnung mir das klar bestätigt, dann würde ich mir so eine Alternative sicher ernsthaft anschauen.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
Forumsumfrage: Welche debianartige Distribution / SubDistri nutzt du?
Und wenn ihr textet das Abstimmen im Formular nicht vergessen ...

Antworten