[obsolet] Shellskript mit case - ein Fall in Hintergrund

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
chrbr
Beiträge: 623
Registriert: 29.10.2022 15:53:26

[obsolet] Shellskript mit case - ein Fall in Hintergrund

Beitrag von chrbr » 26.02.2023 19:47:45

Hallo Debianer,

Das System ist Debian/Bullseye mit fetchmail und unbound als DNS Cache/Resolver. Nach dem Start des Netzwerkes brauch unbound etwas Zeit zum Schlüsselaustausch bis die DNS Abfragen funktionieren.
Damit die Logs sauber bleiben will ich vor dem Starten von fetchmail abfragen, ob der Mailserver erreichbar ist. Das sollte im Hintergrund passieren. Hier ist ein Ausschnitt als diff vorher/nachher:

Code: Alles auswählen

 case "$1" in
     start)
         # Start daemons.
-       (while test $unbound -eq 0 -a $ctr -lt 30 
-       do 
-               sleep 1
-               test $(dig +short securepop.t-online.de|head -n 1) && unbound=1
-               ctr=$((ctr+1))
-       done
-       runuser -s /usr/bin/sh $user -c "/usr/bin/fetchmail --daemon 300 --syslog --fetchmailrc $conf") &
+       /usr/local/bin/fetchmail-start
        ;;

     stop)
     	... und so weiter
Zuerst hatte ich den Teil mit den Minus-Zeichen im Skript. Dabei erhalte ich in den Logs eine Fehlermeldung.

Code: Alles auswählen

# grep fetchmail-pop3 /var/log/daemon.log
...
Feb 26 17:08:03 lenovo fetchmail-pop3[7619]: /usr/local/bin/fetchmail-pop3: 33: Syntax error: ")" unexpected (expecting ";;")
Wenn ich den Block mit den Minu-Zeichen in eine Datei fetchmail-start auslagere, dann sind die Logfiles sauber. Das wäre das Skript nur min der Zeile mit dem Plus-Zeichen. Nun meine Frage: Kann ich im Block "start" den eingeklammerten Teil im Hintergrund ausführen, ohne dass ich einen Syntaxfehler bekomme? Wenn ja, wie ist die korrekte Syntax?

Vorab vielen Dank für die Hilfe,
Christoph
[
Zuletzt geändert von chrbr am 27.02.2023 11:36:52, insgesamt 1-mal geändert.

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

Re: Shellskript mit case - ein Fall in Hintergrund

Beitrag von Livingston » 26.02.2023 22:17:31

In Zeile 33 wird kein ")" sondern ";;" erwartet. Ist das vielleicht die letzte ersetzte Zeile mit runuser - ...?
Dann würde ich davor mal nach einer fehlenden, öffnenden Klammer suchen.
Der case-Block sieht auf dem ersten Blick ok aus. Dass Du die while-Schleife in Klammern einschließt und mit "&" in den Hintergrund schickst, ist etwas ungewöhnlich, sollte aber keine Fehler verursachen.
Kannst ja die Schleife testhalber mal von den Klammern und dem "&" befreien. Versuch macht kluch.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

chrbr
Beiträge: 623
Registriert: 29.10.2022 15:53:26

Re: Shellskript mit case - ein Fall in Hintergrund

Beitrag von chrbr » 27.02.2023 11:36:23

Hallo @Livingston,
Livingston hat geschrieben: ↑ zum Beitrag ↑
26.02.2023 22:17:31
In Zeile 33 wird kein ")" sondern ";;" erwartet. Ist das vielleicht die letzte ersetzte Zeile mit runuser - ...?
Die letzte Zeile mit dem vorangestellten Minus Zeichen endet mit ") &". Die nächste Zeile enthält ";;". Nun habe ich die Originaldatei aus meinem lokalen git repository geholt und es gibt keine Fehlermeldung mehr :oops: . Ich habe absolut keine Ahnung, was ich geändert haben sollte. git verändert schließlich nichts. Nun habe ich noch eine Zeile eingefügt, die schreibt wie fetchmail gestartet wurde. Hier ist das komplette Skript.

Code: Alles auswählen

#!/bin/sh
#
# fetchmail This shell script takes care of starting and stopping
# the fetchmail DAEMON.
#
# description: fetchmail fetchs mail from pop3/imap mail servers

conf=/var/lib/fetchmail/fetchmailrc
user=fetchmail

# Fetchmail installed?
[ -f /usr/bin/fetchmail ] || exit 0

unbound=0
ctr=0

# See how we were called.
case "$1" in
    start)
        # Start daemons.
	(while test $unbound -eq 0 -a $ctr -lt 30 
	do 
		sleep 1
		test $(dig +short securepop.t-online.de|head -n 1) && unbound=1
        	ctr=$((ctr+1))
	done
	logger "fetchmail started after $ctr trials"
	runuser -s /usr/bin/sh $user -c "/usr/bin/fetchmail --daemon 300 --syslog --fetchmailrc $conf") &
	;;

    stop)
        # Stop daemons.
	/usr/bin/fetchmail --quit > /dev/null 2>&1
        #rm -f /var/lock/subsys/fetchmail
        ;;

    restart)
        $0 stop
        $0 start
        ;;

    *)
        echo "Usage: fetchmail {start|stop|restart}"
        exit 1
esac
exit 0
Ich setzte den Titel mal auf [obsolet] und beobachte, ob sich etwas ändert.

Trotzdem vielen Dank für die Rückmeldung,
Christoph

Antworten