Cronjob automatisch anpassen

Status
Für weitere Antworten geschlossen.

Harry_89

Benutzer
Mitglied seit
07. Mrz 2010
Beiträge
254
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich hab mal wieder eine Frage.

Ist es möglich einen bestimmten Cronjob zu ändern?

BSP:
Ich habe derzeit einen Cronjob eingerichtet der jeden Tag um 20 Uhr läuft.

Jetzt möchte ich aber, dass dieser Cronjob im Juli erst um 22 Uhr läuft und im November sollte er um 17 Uhr laufen.

Kann man dies irgendwie einstellen, dass dieser Cronjob automatisch abgeändert wird oder ist dies nur zu lösen wenn man für jeden Monat einen eigenen Cronjob anlegt?

Danke für die Hilfe.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
ich denke am schnellsten dürfte das mit drei einzelnen cronjobs zu machen sein. Du könntest aber als Alternative auch ein kleines Script schreiben (z.B. php), das das Datum prüft und entsprechend reagiert z.B.
PHP:
#!/usr/bin/php
<?php
$date = time();
if($date >= mktime(0,0,0,7,1,2012) && $date < mktime(0,0,0,8,1,2012)){
 sleep(5*3600);
 #Aufgabe ausführen Juli
}elseif($date >= mktime(0,0,0,11,1,2012) && $date < mktime(0,0,0,0,12,1,2012)){
  #Aufgabe ausführen im November
} else{
 sleep(3*3600);
 #Aufgabe ausführen für den Rest der Zeit
}
dieses Script dann täglich um 17Uhr laufen lassen. Bis zum Juli, zwischen August und November und nach Anfangs Dezember schläft das Script 3 Stunden und führt dann die Aufgabe aus. Im Juli schläft es 5h und dann die Aufgabe und im November wird die Aufgabe sofort bei Aufruf ausgeführt.
Den Code habe ich aber nur so auf die Schnelle getippt. Also keine Garantie für irgendwas ;-)
 

Harry_89

Benutzer
Mitglied seit
07. Mrz 2010
Beiträge
254
Punkte für Reaktionen
0
Punkte
0
Danke Danke für die Hilfe.

Das ist die Lösung. :)

Ich werds zu Hause probieren und noch etwas anpassen.

Vielen Dank nochmals für die prompte Hilfe. :)
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
als Alternative auch ein kleines Script schreiben (z.B. php), das das Datum prüft und entsprechend reagiert z.B.

wer könnte uns das als Shell-Skript schreiben (einmal ash - einmal bash)?

wer kennt den IPKG 'at' und kann es damit schreiben?

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@itari
an ein Shellscript habe ich auch gedacht, aber die Datumsvergleiche sind in PHP so was von einfach. Hätte keinen Plan wie man das mit der Shell machen könnte :)
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Hätte keinen Plan wie man das mit der Shell machen könnte :)

das wäre jetzt die Ambition *gg*

ich geb mal Tipps: date enthält viele Formate und was nicht hübsch genug ist, macht der awk putzig
 

Nomad

Benutzer
Mitglied seit
23. Okt 2008
Beiträge
597
Punkte für Reaktionen
0
Punkte
0
PHP und SH kommen mir zu umständlich zumal wir mit cron welches wir sowieso benötigen ein Tool haben das für genau solche Fälle gedacht ist?

Cron hat auch ein Feld für Monat...

Greift man nicht gerade zum NAS um Energie zu sparen? :)
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@itari
das mit date habe ich auch gesehen. Nur wie macht man damit dann arithmetische Vergleiche? Das werden ja Strings sein. Muss man die dann mit expr erst "konvertieren" damit man Grösser-Kleiner-Vergleiche machen kann? Das klingt nach viel Gebastel ;-)
Ist denn date auf der DS "vollwertig" und kennt alle Parameter, die ein GNU date auch kennt? Ich setz mich bei Zeiten mal daran und spiel ein bissl damit rum. Wer weiss vielleicht wird es was :)

Gruss

tobi
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Greift man nicht gerade zum NAS um Energie zu sparen?
das musst du mir aber erklären inwiefern ein php Script zu mehr Stromverbrauch führt als ein normaler aufruf via cron ;-)
Wenn man es via cron macht wird es einfach aufwändiger. imho wird man dafür 4 Jobs brauchen: einen für Juli, einen für November, einen für die Zeit nach November aber vor Juli und einen zwischen August und November. Oder kann man im crontab bei Monat auch folgendes machen? 1-6,8-10,12 Falls das ginge wären es nur noch 3 Jobs
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
@itari
das mit date habe ich auch gesehen. Nur wie macht man damit dann arithmetische Vergleiche? Das werden ja Strings sein. Muss man die dann mit expr erst "konvertieren" damit man Grösser-Kleiner-Vergleiche machen kann? Das klingt nach viel Gebastel ;-)
Ist denn date auf der DS "vollwertig" und kennt alle Parameter, die ein GNU date auch kennt? Ich setz mich bei Zeiten mal daran und spiel ein bissl damit rum. Wer weiss vielleicht wird es was :)

mach es doch so wie in deinem PHP-Beispiel und leg die etwas aufbereitete Zeit, z.B. 201205112359 in eine Shellvariable, mit der du dann das awk-Skript fütterst - im awk kannst locker alles hübsch vergleichen - geht fast so wie im PHP

Itari
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
zumal wir mit cron welches wir sowieso benötigen ein Tool haben das für genau solche Fälle gedacht ist?

ich wüsste nicht, wie man dem cron sagen könnte, dass zwischen dem 1.Juni und dem 30.September etwas jeden Tag um 20:00 zu machen wäre, deswegen ja unsere Skript-Ideen

Itari
 

Nomad

Benutzer
Mitglied seit
23. Okt 2008
Beiträge
597
Punkte für Reaktionen
0
Punkte
0
das musst du mir aber erklären inwiefern ein php Script zu mehr Stromverbrauch führt als ein normaler aufruf via cron ;-)
Wenn man es via cron macht wird es einfach aufwändiger. imho wird man dafür 4 Jobs brauchen: einen für Juli, einen für November, einen für die Zeit nach November aber vor Juli und einen zwischen August und November. Oder kann man im crontab bei Monat auch folgendes machen? 1-6,8-10,12 Falls das ginge wären es nur noch 3 Jobs

PHP oder sh sind nicht gerade die leichgewichtigsten Prozesse. Cron wird aber wohl sowieso laufen und die Rechnerei mit Datum wird dort höchst effizient gestaltet sein, jedenfalls effizienter als date + eval jemals sein werden.

So wie ich verstehe gibt es zwei Alternativen:

1. Man baut mit PHP/SH cron nach, was ich für sinnfrei halte. Allein der Speicherverbrauch dürfte schon spürbar sein, wir reden hier ja nicht von Servern mit xx GB RAM. Von Verhalten beim Logging, Benachrichtigung, Shutdown und Reboot will ich gar nicht reden...

2. Man baut mit PHP/SH einige Zeilen crontab nach indem man ein Script mit cron startet und das Scheduling dem Script überlässt, halte ich für ebenso sinnfrei weil die Schedulinginformation immer wieder aufs neue berechnet werden muss und die Prozesse im Speicher hocken und warten bis sie eine Aktion auslösen.

Nicht zuletzt wird das Modifizieren/Debuggen eines crontabs wesentlich einfacher sein als bei einem Script.

Habe ich etwas übersehen?

Sicherlich werden die Platten/Wirkungsgrad des Netzteils etc. den Stromverbrauch bestimmen aber (verschwendete) CPU Zyklen gibt es auch nicht ohne Strom. :)
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Nicht zuletzt wird das Modifizieren/Debuggen eines crontabs wesentlich einfacher sein als bei einem Script.
da afaik nur root crontab modifizieren darf würde ich keine Manipulation von crontab mittels Script machen. Der zusätzliche Speicherbedarf durch php cli ist recht überschaubar, klar ein bissl mehr als im Leerlauf, aber auch cron wird sich u.U. mehr Speicher nehmen.
Was ist für dich besser? Ein Server praktisch dauernd im Leerlauf oder einer der immer wieder mal Last hat. Von der reinen Effizienz her ist ein praktisch schlafender Server recht schlecht. So erreichen z.B. Netzteile ihren optimalen Wirkungsgrad erst unter einer bestimmten Last. Ein Netzteil, das nichts zu tun hat dürfte also ineffizienter sein
 

Nomad

Benutzer
Mitglied seit
23. Okt 2008
Beiträge
597
Punkte für Reaktionen
0
Punkte
0
da afaik nur root crontab modifizieren darf würde ich keine Manipulation von crontab mittels Script machen. Der zusätzliche Speicherbedarf durch php cli ist recht überschaubar, klar ein bissl mehr als im Leerlauf, aber auch cron wird sich u.U. mehr Speicher nehmen.
Was ist für dich besser? Ein Server praktisch dauernd im Leerlauf oder einer der immer wieder mal Last hat. Von der reinen Effizienz her ist ein praktisch schlafender Server recht schlecht. So erreichen z.B. Netzteile ihren optimalen Wirkungsgrad erst unter einer bestimmten Last. Ein Netzteil, das nichts zu tun hat dürfte also ineffizienter sein

Wenn man einen passenden crontab hat, warum ihn nicht drin lassen? Dann wäre die Sache damit erledigt. Mit der zweiten Weg meinte ich meinte ich ausdrücklich eine Modifizierung der Scheduling. Einfach gesagt, das Script guckt nach, soll ich nun um eine Stunde verzögern oder zwei?

0 Watt bei 10% Wirkungsgrad bleibt 0 Watt. 10 Watt bei 100% Wirkungsgrad bleibt 10 Watt.
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.250
Punkte für Reaktionen
2.846
Punkte
423
Ich wäre im Prinzip auch für die crontab-Methode, zum Ausführen zyklischer Jobs ist der crond ja da, aber:

Die DS verfügt nur über einen eingeschränkten crond, über die busybox realisiert. Die /etc/crontab ist von jedem beschreibbar, das ist nicht das Problem:
Code:
ls -als /etc/crontab
-rw-rw-rw-    1 root     root           144 Apr 17 10:18 /etc/crontab
aber ob der crond Änderungen daran automatisch erkennt oder ein Signal (-HUP z.B.) zum Neueinlesen braucht, weiss ich nicht. Das kann man aber probieren.
Als root sollte es aber schon funktionieren, notfalls mit einem Neustart des crond.

Gruß Benares
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@Benares
wieder was gelernt. Dachte crontab sei root write only :) afaik musst du bei Änderungen an crontab den cron ned neustarten, das sollte der in diesem File eigentlich mitbekommen. ansonsten reicht es den cron mittels HUP signal zu zwingen seine configs neu einzulesen
Code:
kill -HUP $(pidof cron)
@itari
ich bin echt überrascht wie "einfach" das Rechnen mit Datum auf der Konsole ist. Dachte immer da müsste man Krücken wie expr oder so was verwenden. Habe drum bis jetzt immer PHP Scripte für solche Rechnereien gebraucht.
Aber es ist so einfach:
Code:
#!/bin/bash

datumBeg=$(date +"%s" -d '2012-04-01 00:00:00')
datumEnd=$(date +"%s" -d '2012-05-01 00:00:00')
datumAkt=$(date +"%s")
[ $datumBeg -lt $datumAkt ] && [ $datumEnd -gt $datumAkt ] && echo 'Zwischen' && exit 0
[ $datumBeg -gt $datumAkt ] && echo 'Vor' && exit 0
[ $datumEnd -lt $datumAkt ] && echo 'Nach' && exit 0
einfach das Datum in einen UNIX Timestamp (+"%s") in Sekunden und dann kann man sehr gut Vergleiche machen
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
ja das Rechnen und Vergleichen ist recht einfach in Shell ...

darüberhinaus, muss ja die 'ash' nicht jedesmal ins RAM geladen werden, weil der init (ist ja auch die Busybox wie die ash) eh läuft ... anders als beim CL-PHP, der wird geladen

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
hier mal noch eine flexiblere Version für mehrere Intervalle
Code:
#!/bin/bash


datumBeg_1=$(date +"%s" -d '2013-04-01 00:00:00')
datumEnd_1=$(date +"%s" -d '2013-05-21 00:00:00')
datumBeg_2=$(date +"%s" -d '2011-04-01 00:00:00')
datumEnd_2=$(date +"%s" -d '2012-06-01 00:00:00')
datumBeg_3=$(date +"%s" -d '2011-04-01 00:00:00')
datumEnd_3=$(date +"%s" -d '2012-06-01 00:00:00')
datumAkt=$(date +"%s")


i=1


while true ; do
 datumBeg=$(eval "echo \$$(echo datumBeg_$i)")
 datumEnd=$(eval "echo \$$(echo datumEnd_$i)")
 [ "x$datumBeg" = 'x' ] && break
 [ "x$datumEnd" = 'x' ] && break
 [ $datumBeg -lt $datumAkt ] && [ $datumEnd -gt $datumAkt ] && echo 'Im Intervall '$i
 [ $datumBeg -gt $datumAkt ] && echo 'Vor Intervall '$i
 [ $datumEnd -lt $datumAkt ] && echo 'Nach Intervall '$i
 i=$(expr $i + 1)
done
 

xabano

Benutzer
Mitglied seit
17. Aug 2008
Beiträge
411
Punkte für Reaktionen
0
Punkte
22
ich wüsste nicht, wie man dem cron sagen könnte, dass zwischen dem 1.Juni und dem 30.September etwas jeden Tag um 20:00 zu machen wäre, deswegen ja unsere Skript-Ideen
Dieses Beispiel läuft täglich von Juni bis September um 20:00 Uhr
Rich (BBCode):
0	20	*	6-9	*
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
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