[gelöst] debian bash script - while do parallel processing

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

[gelöst] debian bash script - while do parallel processing

Beitrag von joe2017 » 24.07.2023 09:51:46

Hallo zusammen,

ich habe ein Problem mit einem Script im Hintergrund geschrieben. Ich habe in meinem Script eine Dauerschleife (Abfrage) eingebaut.
Jedoch wird mein Script ab diesem Punkt nicht weiter ausgeführt. Wie kann ich die while Schleife als Parallel Process im Hintergrund laufen lassen?

Code: Alles auswählen

Script...

while sleep 5; do
  Abfrage und Aktion
done

Script...
Mit einem "&" habe ich an keiner Stelle ein Ergebnis erzielen können.
Gibt es hier einen anderen Trick?
Zuletzt geändert von joe2017 am 24.07.2023 11:36:32, insgesamt 1-mal geändert.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: debian bash script - while do parallel processing

Beitrag von JTH » 24.07.2023 10:01:20

Die ganze Schleife in den Hintergrund schieben:

Code: Alles auswählen

Script...

while sleep 5; do
  Abfrage und Aktion
done &

Script...

Die Schleife läuft damit allerdings in einer Subshell. D.h. (unter anderem) Variablen, denen du innerhalb der Schleife Werte zuweist, sind außerhalb der Schleife nicht sichtbar/verfügbar.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: debian bash script - while do parallel processing

Beitrag von joe2017 » 24.07.2023 10:03:36

Ich habe das gerade mit folgendem Befehl getestet.
Funktioniert auch. Jedoch läuft die Schleife nach dem Beenden des Hauptscripts weiter.

Code: Alles auswählen

Script...

(while sleep 5; do
  Abfrage und Aktion
done) &

Script...
Wie kann ich das jetzt beenden? :facepalm:

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: debian bash script - while do parallel processing

Beitrag von JTH » 24.07.2023 10:06:17

joe2017 hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 10:03:36
Jedoch läuft die Schleife nach dem Beenden des Hauptscripts weiter. […] Wie kann ich das jetzt beenden? :facepalm:
Auf die „harte“ Tour:

Code: Alles auswählen

Script...

while sleep 5; do
  Abfrage und Aktion
done &
loop_pid=$!

Script...

kill $loop_pid
wait
Ob das für dein Skript geeignet ist, hängt davon ab, wie kritisch oder fehlertollerant die Aktionen innerhalb der Schleife sind.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: debian bash script - while do parallel processing

Beitrag von joe2017 » 24.07.2023 10:14:30

ich habe das hinter meinen exit Button gelegt.

Code: Alles auswählen

--button="Exit":"bash -c end && kill $loop_pid
"end" ist übrigens eine funktion. Hier habe ich auch schon versucht den kill Befehl aufzunehmen.

Leider läuft das immer noch. Wie kann ich den Process beenden. Wie müsste dieser heißen?
ich starte ein paplay $soundfile"
Zuletzt geändert von joe2017 am 24.07.2023 10:41:40, insgesamt 2-mal geändert.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: debian bash script - while do parallel processing

Beitrag von joe2017 » 24.07.2023 10:22:39

Im terminal funktioniert das Ganze. Somit muss es an dem Button liegen.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: debian bash script - while do parallel processing

Beitrag von joe2017 » 24.07.2023 10:55:24

Ich habe es jetzt anders gelöst.

Ich habe mir die variable loop_pid in ein tempfile geschrieben und in der funktion "end" mittels "kill $(cat /path/to/tempfile) beendet.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: debian bash script - while do parallel processing

Beitrag von JTH » 24.07.2023 12:59:24

Noch als Ergänzung, warum es oben nicht funktioniert hat:
joe2017 hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 10:14:30
ich habe das hinter meinen exit Button gelegt.

Code: Alles auswählen

--button="Exit":"bash -c end && kill $loop_pid
"end" ist übrigens eine funktion. Hier habe ich auch schon versucht den kill Befehl aufzunehmen.
Und die Schleife und das Zuweisen der loop_pid-Variable sind in der Funktion?

Dann kann das so, wie du beobachtet hast, nicht funktionieren. Denn durch das bash -c end rufst du die Funktion in einer neuen Shell-Instanz auf. Nachdem sich die beendet hat, ist die Variable nicht mehr existent. Du müsstest dann beides in derselben Shell aufrufen und auch dafür sorgen, dass die Variable erst dann ersetzt wird:

Code: Alles auswählen

--button="Exit":"bash -c 'end && kill $loop_pid'"

joe2017 hat geschrieben: ↑ zum Beitrag ↑
24.07.2023 10:55:24
Ich habe mir die variable loop_pid in ein tempfile geschrieben und in der funktion "end" mittels "kill $(cat /path/to/tempfile) beendet.
Das passt. Das ist auch ein übliches und verbreitetes Muster, um Prozess-IDs hin-und herzureichen. Kannst ja mal in /run suchen ;)

Code: Alles auswählen

find /run -name '*pid*' 2>/dev/null
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten