sh Script verhindert neustart/update

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

FaBay

Benutzer
Registriert
04. Apr. 2015
Beiträge
5
Reaktionspunkte
0
Punkte
0
Hi,

ich habe mir ein sh Script geschrieben, welches mir unter gewissen Vorraussetzungen und Zeitintervallen ein USR1-Signal an den fetchmail Prozess sendet, um einen POP3-Rundruf zu starten.
Das Script funktioniert an sich super, alle Mail Konten werden abgerufen sobald ich mich mit einem Gerät per IMAP verbinde.

Aber nun zu meinem Problem: Wenn ein DSM Update verfügbar ist und ich versuche dieses zu installieren, bleibt der Update Prozess hängen. Ich vermute, dass es an diesem Script liegt. In der log Datei erscheint eine Zeile mit vielen "NUL"-Einträgen. Anscheinend hängt sich das Script an einer gewissen Stelle auf, wenn es selbst oder irgendein anderer Prozess beendet wird. Hat jemand eine Idee woran das liegen könnte?

Ich habe nicht allzuviel Erfahrung mit sh Scripts, daher sind Anmerkungen jeglicher Art sehr willkommen.

Grüße und danke,

Fabian

Script:
Rich (BBCode):
#!/bin/sh

#exec >> /volume1/homes/Fabian/imapscript.log 2>&1

si=2  		# Intervall zum Suchen neuer IMAP Verbindungen in Sek
wi=30		# Wartezeit nach erfolgtem Abruf in Sek
wt=600		# Zeit bis Abrufintervall wi2 genutzt wird in Sek
wi2=120 	# Langsameres Intervall für dauerhafte Verbindungen in Sek


log(){
	d=`date '+%Y-%m-%d %H:%M:%S'`
	echo "$d: $1" >> $log
}


sendSignal(){
	if [ -e "/volume1/homes/$usr/.Maildir/fetchmail.pid" ]; then
		pid=$(head -n 1 "/volume1/homes/$usr/.Maildir/fetchmail.pid")
		if [ $pid -gt 1 2>/dev/null ]; then
			kill -USR1 $pid >> $log 2>&1
		else
			log "PID scheint falsch!"	
		fi
	else 
		log "Keine PID gefunden!"
	fi
}


usr="$(whoami)"
if [ -d "/volume1/homes/$usr" ]; then
	log="/volume1/homes/$usr/imapscript.log"
else
	echo "User $usr hat keinen Home Ordner!"
	exit 0
fi

count=`ps | grep -c -E "$usr .*imapscript.sh"`
if [ $count -gt 4 ]; then
	log "Ist bereits gestartet"
	exit 0
fi

i=0
proclast=0
timer=$(date +%s)
while true; do
	procnow=`ps | grep -E "$usr.*dovecot/imap" | grep -c -v "grep"`
	if [ $procnow -gt 0 ]; then
		if test $procnow -gt $proclast; then
			i=0
			log "Neue IMAP Verbindung gefunden. Abruf wurde gestartet..."
			if [ $timer -eq 0 ]; then 
				timer=$(date +%s)
			fi
		fi
		proclast=$procnow
		j=$((wt/wi))
		if [ $i -lt $j ] || [ $((i%((wi2-wi)/si+1))) -eq $j ]; then
			if [ $i -eq $j ]; then
				log "Die Wartezeit wurde erhöht..."
			fi
			sendSignal
			sleep $wi
		else
			sleep $si
		fi
		i=$((i+1))
	else
		if [ $timer -ne 0 ]; then
			log "Gestoppt nach $((($(date +%s)-timer)/60)) Min"
			timer=0
			proclast=0
		fi
		sleep $si
	fi
done

Kurze Erklärung der Zeitintervalle: Alle 2 sek wird nach neuen IMAP Verbindungen gesucht. Falls eine neue Verbindung gefunden wurde, wird das Signal gesendet. Nach dem Senden des Signals wird 30 sec gewartet. Falls die IMAP Verbindung noch besteht, wird erneut ein Signal gesendet. Falls die Verbindung länger als 600 sek besteht, wird statt alle 30 sek nur noch alle 120 sek ein Signal gesendet.
 
Zuletzt bearbeitet:
das Script läuft scheinbar in einer Endlosschleife. Das dürfte den Shutdown verhindern. Kill das Script mal manuell und guck ob dann das Update geht
 
Das Script soll ja auch in einer Endlosschleife laufen, ist ja Sinn der Sache ;)

Ich habe die DS neu gestartet, das Script wieder ausgeführt, das Update gestartet, und es hat funktioniert, trotz laufendem Script. Allerdings tritt es immer wieder auf wenn ein Update verfügbar ist.
Es scheint nur manchmal hängen zu bleiben, vielleicht wenn es an einer bestimmten Stelle ist...?
Irgenetwas scheint ja schief zu laufen, wie man an den NUL Zeilen im log sieht. Der letzte Log-Eintrag vor der NUL-Zeile war jeweils "Neue IMAP Verbindung gefunden. Abruf wurde gestartet...".
 
das ist mir schon klar dass es der Sinn der Sache ist. Nur weiss ich auch, dass man sich damit u.U. den Shutdown verhindern kann. Es dürfte kaum an einer bestimmten Stelle im Script liegen.
Gut möglich, dass diese NUL Zeilen kommen, weil der Shutdown/Reboot versucht /volume1 auszuhängen. Gelingt ihm das, weil z.B. aktuell nichts darauf zugreift, dann ziehst du deinem Script wichtige Daten unter dem Hintern weg. Du machst die Prüfung ob /volume1 vorhanden ist nur einmal bei Start. Danach soweit ich sehen kann nicht mehr. Prüfe das bei JEDEM Schleifendurchlauf und beende dein Script wenn dieser Mount nicht mehr da ist
 
Das ist ein sehr guter Punkt. Leider lässt sich das Problem bei einem normalen neustart nicht reproduzieren, auch nicht wenn alle 2 sek was in den Log geschrieben wird.

Aber ich werde es ändern, kann dann leider erst beim nächsten Update feststellen ob es geholfen hat :/

Vielen Dank, ich melde mich falls ich was heraus finde :)
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat