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:
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.
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: