sh Script verhindert neustart/update

Status
Für weitere Antworten geschlossen.

FaBay

Benutzer
Mitglied seit
04. Apr 2015
Beiträge
5
Punkte für Reaktionen
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:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
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
 

FaBay

Benutzer
Mitglied seit
04. Apr 2015
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
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...".
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
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
 

FaBay

Benutzer
Mitglied seit
04. Apr 2015
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
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 

 
 
  AdBlocker gefunden!

Du bist nicht hier, um Support für Adblocker zu erhalten. Dein Adblocker funktioniert bereits ;-)

Klar machen Adblocker einen guten Job, aber sie blockieren auch nützliche Funktionen.

Das Forum wird mit hohem technischen, zeitlichen und finanziellen Aufwand kostenfrei zur Verfügung gestellt. Wir zeigen keine offensive Werbung und bemühen uns um eine dezente Integration.

Bitte unterstütze dieses Forum, in dem du deinen Adblocker für diese Seite deaktivierst.

Du kannst uns auch über unseren Kaffeautomat einen Kaffe ausgeben oder ein PUR Abo abschließen und das Forum so werbefrei nutzen.

Vielen Dank für Deine Unterstützung!