Hook für IMAP Komandos

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Habe mal noch ein bisschen weitergemacht, weil ich das Script auch für meinen Server verwenden will.
Die Option force ist raus, weil das Script jetzt wirklich endlos läuft und damit selber prüfen muss wann es Zeit ist das Abholen der Emails zu erzwingen auch wenn kein Client mehr verbunden ist

Code:
#!/opt/bin/bash

## HIER DEN PFAD ANPASSEN
pfad_getmail="/pfad/zu/deinem/getmail.sh"

if [ -e /tmp/checkmail ]; then
 echo "Code rennt bereits"
 exit
fi

if [ "$(whoami)" = "root" ]; then
 echo "Code darf NIEMALS unter root laufen. Das gibt Aerger mit dem Dovecot!"
 exit
fi

if [ ! -e $pfad_getmail ]; then
 echo "$pfad_getmail konnte nicht gefunden werden"
 exit
fi

i=0
touch /tmp/checkmail
echo $$ > /tmp/checkmail
while true; do
 s=`ps | grep imap | grep -v "imap-login" | grep -v "grep imap"`
 if [ "$s" != '' ]; then
  i=0
  $pfad_getmail &> /dev/null
  sleep 60
 else
  i=`expr $i + 1`
  sleep 1
  if [ `expr $i % 3600` -eq 0 ]; then
   i=0
   $pfad_getmail &> /dev/null
  fi
 fi
done
Wenn ein Client verbunden ist, wird alle 60s das getmail.sh ausgeführt und die Emailkonten werden abgefragt.
Wenn kein Client verbunden ist, dann prüft das Script jede Sekunde ob ein Client da ist und nach 3600s (1h) werden in jedem Fall die Konten geleert. Ob ein Client da ist oder nicht ist dann egal.

Die Wartezeit von 1s wenn kein Client da ist, ist etwas kurz. Für die nächsten Tage lasse ich das Script mal mit 1s laufen (so als kleiner Lasttest)

Wichtig: Die Variable pfad_getmail musst du noch anpassen, so dass der Pfad zu DEINEM getmail korrekt ist

@all
Weiss eigentlich jemand ob es eine eine maximale PID gibt? Oder ist das nach oben offen? Weil bei meinem obigen Code bekommt jeder sleep Aufruf eine neue PID. Könnte es damit zu Problemen kommen, wenn das Script sehr lange läuft?
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
@jahlives

Erstmal vielen Dank für das anpassen deines scripts. Manuell funktioniert es. Wie bekomme ich es nun hin, dass der Prozess ausgeführt wird, wenn ein Client angemeldet ist, wenn aber kein Client angemeldet ist, die Mailstation alle 3 Stunden die Mails von den externen Postfächern abholt, so dass sich die Diskstation in der Zwischenzeit schlafen legen kann?

Ein Cron mit der 3 Stunden Abfrage läuft bereits.
 

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
14
Punkte
84
in der Zeile
Rich (BBCode):
if [ `expr $i % 3600` -eq 0 ]; then
den Wert 3600 mit deinem gewünschtem Wert ersetzen. 3600 Sekunden = 60 Minuten = 1 Stunde. Für 3 Stunden muss dort der Wert 10800 stehen.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
in der Zeile
Rich (BBCode):
if [ `expr $i % 3600` -eq 0 ]; then
den Wert 3600 mit deinem gewünschtem Wert ersetzen. 3600 Sekunden = 60 Minuten = 1 Stunde. Für 3 Stunden muss dort der Wert 10800 stehen.
So wie QTip gechrieben hat oder indem du sleep 3 anstelle von sleep 1 verwendest. Denn genau genommen prüft das Script nicht die Zeit sondern die Anzahl Durchläufe der Schleife. Wenn ein Durchlauf 3 Sekunden dauert, dann dauern 3600 Durchläufe also 10800 Sekunden ;)
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Ah ok.

@jahlives

Könntest du mir das script einmal für mich anpassen und sagen wohin ich das packen muß?

Was mache ich mit meinem cronjob? Hat sich das dann erledigt?

Ich muß nochmal nachfragen: Die Diskstation legt sich dann auch 3Stunden schlafen und wacht dann wieder auf? Meldet sich innerhalb dieser Zeit ein Client an, so fragt er die Mails sofort ab? Er fragt die Mails so lange in einem Rhytmus von einer Minute ab, bis sich der Client wieder abgemeldet hat?!
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ah ok.

@jahlives

Könntest du mir das script einmal für mich anpassen und sagen wohin ich das packen muß?

Was mache ich mit meinem cronjob? Hat sich das dann erledigt?

Ich muß nochmal nachfragen: Die Diskstation legt sich dann auch 3Stunden schlafen und wacht dann wieder auf? Meldet sich innerhalb dieser Zeit ein Client an, so fragt er die Mails sofort ab? Er fragt die Mails so lange in einem Rhytmus von einer Minute ab, bis sich der Client wieder abgemeldet hat?!
Komm schon, das einzige was du anpassen musst ist die Variable pfad_getmail in der 2. Zeile des Codes. Dort zwischen " und " einfach deinen korrekten Pfad angeben :)
Wo du das Script speicherst und wie du es benennst ist vollkommen egal

Die Sache mit dem Cronjob hat sich dann soweit erledigt, denn das Script läuft ja endlos.

Die DS wird spätestens nach 3600sec das Abholen erzwingen (du kannst auch andere Werte festlegen, QTip hat dir ja gezeigt wie). Sollte in der Zwischenzeit ein Client via IMAP einen Login machen, dann wird das Abholen solange ein Client verbunden ist alle 60sec ausgeführt.
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Ok, dass sollte ich schaffen! Danke.

Eine frage habe ich noch. Die Platte geht aber in Schlafzustand?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ok, dass sollte ich schaffen! Danke.

Eine frage habe ich noch. Die Platte geht aber in Schlafzustand?
Das Script sollte den Sleep der Platten eigentlich nicht verhindern. Wenn also nichts anderes die Platten weckt, dann sollte sie 3h schlafen können bis das Script die Emails wieder abholt;)
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Und ich muß das Script als Benutzer ausführen?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Und ich muß das Script als Benutzer ausführen?
Als Benutzer für den die Emails sind. Als root geht es z.B. mittels su
Code:
su DEIN_USER -c "/pfad/zum/script" &
Damit wird das Script unter DEIN_USER gestartet und in den Hintergrund geschickt (&)
Das Script schreibt seine PID (Process ID) in die Datei /tmp/checkmail Wenn du also das Script stoppen willst, dann kannst du es z.B: so machen
Code:
kill $(cat /tmp/checkmail)
#und das checkmail file entfernen
rm /tmp/checkmail
wenn du nur sehen willst ob der Script noch läuft
Code:
ps | grep $(cat /tmp/checkmail)
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Rich (BBCode):
#!/opt/bin/bash

pfad_getmail="/volume1/homes/User/getmail.sh"

if [ -e /tmp/checkmail ]; then
 echo "Code rennt bereits"
 exit
fi

if [ "$(whoami)" = "root" ]; then
 exit
fi

if [ ! -e $pfad_getmail ]; then
 echo "$pfad_getmail konnte nicht gefunden werden"
 exit
fi

i=0
touch /tmp/checkmail
echo $$ > /tmp/checkmail
while true; do
 s=`ps | grep imap | grep -v "imap-login" | grep -v "grep imap"`
 if [ "$s" != '' ]; then
  i=0
  $pfad_getmail &> /dev/null
  sleep 60
 else
  i=`expr $i + 1`
  sleep 3
  if [ `expr $i % 3600` -eq 0 ]; then
   i=0
   $pfad_getmail &> /dev/null
  fi
 fi
done

So dürfte der Code doch richtig sein, mit drei Stunden Schlaf für meine Platte?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
@jahlives
Habe es eben mal ausprobiert. Leider geht meine Platte nicht in den Ruhezustand.
Eigentlich müßte sie das ja aber.
Könntest du das mal bei deiner Diskstation probieren?

Den Cronjob habe ich ich gekillt und das obige Script verwendet.


Ist es auch richtig, dass wenn ich die DS neu starte, ich das Script auch neu starten muß?

Wenn ich
ps | grep $(cat /tmp/checkmail)

eintippe, kommt als Ausgabe folgendes:

3644 User 340 S sh Userimap.sh
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Wenn deine Platte nicht schlafen geht, wird sie wohl von einem anderen Dienst aufgeweckt. Durchforste mal deine Logs nach spin up z.B.
Code:
cat /var/log/messages | grep "spin up by"
Irgendwelche Resultate?
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Nein, keine logs!

Kann es sein, dass es mit der 3 bei sleep zusammenhängt? Oder hätte ich 10800 als Zahl eintragen müssen?

Eine Aufgabe die sich auf dovecot bezieht ist:

Feb 15 08:11:35 dovecot: Fatal: Time just moved backwards by 642 seconds. This might cause a lot of problems, so I'll restart myself now. http://wiki.dovecot.org/TimeMovedBackwards
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich kann mir nicht vorstellen, dass ein sleep eine Festplatte wecken würde. Die Sache mit dem Dovecot besagt letztendlich, dass du deine Zeitsync häufiger machen solltest, damit keine so grossen Abweichungen zu stande kommen. Ich mache die Zeitsync einmal beim Start der DS und dann alle 30min wieder. So kommen keine zu grossen Abweichungen zu stande
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Hatte ich eben auch festgestellt, dass ich große Zeitabweichungen habe. Dürfte jetzt aber nicht mehr vorkommen. Hast du vielleicht sonst noch ideen? Habe es noch nicht ausprobiert, ob es was nützt, wenn ich den sleep umstelle!

Läuft ds Script bei dir und legt sich deine DS schlafen?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Zieh mal das Netzwerkkabel ab und schaue dann, ob die DS sauber schlafen geht. Tut sie es, dann ist irgendein Netzwerkdienst am Laufen über den ein Client aus deinem LAN die DS weckt
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Hab es gerad versucht. Die DS schläft nicht ein.
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
@jahlives

Ich habe es gerade probiert:

1. Versuch: Ändern der Werte auf 10800 und sleep 1, DS legt sich nicht schlafen
2. Versuch: Script deaktiviert: DS legt sich schlafen.

Es muß irgendwas in dem Script sein, dass die Platte wach hält.
 
Zuletzt bearbeitet:
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