CronJobs - die Alternative

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
sooo ... ich habe das crond-Logbuch mit eingebaut (/var/log/cron.log). Wie alle Logbücher kann es grenzenlos wachsen und muss daher von Zeit zu Zeit gekürzt bzw. gelöscht werden. Nicht traurig sein, wenn da kein Datum/Uhrzeit drin ist - das ist halt in dem mit der DS ausgelieferten crond nicht vorgesehen.

Der Fehler mit den ' und " dürfte verbessert sein. Allerdings ist bei Sonderzeichen, Umlauten immer eine Kontrolle der /etc/crontab via telnet sinnvoll. Wenn irgendeine crontab-Zeile eine Macke hat, kann es sein, dass der crond nichts ausführt!!! Dran denken, dass ich hier den UTF-8 Zeichensatz im HTML entgegennehme (wie Samba), und das das nicht der Zeichensatz im telnet ist (Umlaute-Problematik).

Daneben gibt es noch ein paar Überlegungen, die man für sich verinnerlichen sollte: Der crond kann auch ohne "Tabs" die Zeilen interpretieren, aber beim Systemstart schau die DS mit ein paar Programmen auf die /etc/crontab und schmeißt alles raus, was nicht ok ist, z.B. auch Zeilen ohne Tabs. Warum? Weil Downloader, zeitgesteuerte Sicherung usw. ja funktionieren sollten und das möglicherweise durch falsche Benutzereintragungen gefährdet würde. Das ist auch der Grund, warum man so wenig Benutzer-Oberflächen zur crontab findet, weil der DAU immer ein Risiko ist. Aber mich juckt das nicht, wenn ihr eure Systeme in Grund und Boden fahrt ... :D, macht immer schön eine Sicherung, dann ist es nie wirklich schlimm, denn das neue Einspielen der Firmware geht ja fix :D. Ich hab überlegt, ob ihr es von Vorteil anseht, wenn bestimmte Dateiendungen (.mp3, .wav, .avi usw) nicht zulässig sind ...

Rich (BBCode):
<?php
if ($_REQUEST['action'] == 'save') {
  $out='';
  for($r=1;$r<=$_REQUEST['rows'];++$r) 
    if ($_REQUEST['r'.$r.'c0']!='') for($c=0;$c<7;++$c) $out.=$_REQUEST['r'.$r.'c'.$c].($c<6?chr(9):chr(10));
  file_put_contents('/etc/crontab', stripslashes($out));
  exec('killall crond;crond -l 8 -L /var/log/cron.log'); 
  }
$filearray=file('/etc/crontab');
$_REQUEST['action'] == '';
$l=isset($_REQUEST['lines'])?$_REQUEST['lines']:20;
?>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>cronjobs</title>
<style>body,input{font:12px Arial;margin-right:1px;margin-bottom:1px}h3{font-family:Arial}
body{background-color:#ddf}pre{font-size:10px;padding:2px;background-color:#eef}</style>
<script>
function mark(r) {
  var e=document.getElementsByName(r+'c0')[0];
  if (e.value.charAt(0)=='#') 
    for (var i=0;i<7;++i) document.getElementsByName(r+'c'+i)[0].style.color='#444';
  else
    for (var i=0;i<7;++i) document.getElementsByName(r+'c'+i)[0].style.color='#090';
}
</script> 
</head><body><h3>CronJobs</h3>
<form method="post" action="cronjobs.php">
<input type="hidden" id="action" name="action" value="">
<?php
$r=0;
foreach($filearray as $rec) {
  $r++; $c=0;$f=explode(chr(9),htmlspecialchars($rec));
  print '<input title="*|0..59: 8 1,3,5 2-5 * */2" name="r'.$r.'c0" type="text" size="8" '.($r==1?'readonly':'').' value="'.$f[0].'"/>';
  print '<input title="*|0..23: 8 1,3,5 2-5 * */2" name="r'.$r.'c1" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[1].'"/>';
  print '<input title="*|1..31: 8 1,3,5 2-5 * */2" name="r'.$r.'c2" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[2].'"/>';
  print '<input title="*|1..12: 8 1,3,5 2-5 * */2" name="r'.$r.'c3" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[3].'"/>';
  print '<input title="*|0..7: so=0/7 sa=6" name="r'.$r.'c4" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[4].'"/>';
  print '<input name="r'.$r.'c5" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[5].'"/>';
  print '<input name="r'.$r.'c6" type="text" size="40" '.($r==1?'readonly':'').' value="'.$f[6].'"/>';
  if ($r>1) {
    print '<script>mark("r'.$r.'")</script>';
?>
<input type="button" value="X" title="delete"
          onclick="for (var i=0;i<7;++i) document.getElementsByName('r<?php print $r ?>c'+i)[0].value=''"/>
<input type="button" value="#" title="activate / deactivate"
          onclick="var v=document.getElementsByName('r<?php print $r ?>c0')[0];
          if (v.value.charAt(0)!='#') v.value='#'+v.value;else v.value=v.value.substring(1); mark('r<?php print $r ?>')"/>
<?php }
  print '<br/>';                   
  }
$rmax=2+$r++;
for($r;$r<=$rmax;$r++) {
  print '<input title="*|0..59: 8 1,3,5 2-5 * */2" name="r'.$r.'c0" type="text" size="8" value=""/>';
  print '<input title="*|0..23: 8 1,3,5 2-5 * */2" name="r'.$r.'c1" type="text" size="7" value=""/>';
  print '<input title="*|1..31: 8 1,3,5 2-5 * */2" name="r'.$r.'c2" type="text" size="7" value=""/>';
  print '<input title="*|1..12: 8 1,3,5 2-5 * */2" name="r'.$r.'c3" type="text" size="7" value=""/>';
  print '<input title="*|0..7: so=0/7 sa=6" name="r'.$r.'c4" type="text" size="7" value=""/>';
  print '<input name="r'.$r.'c5" type="text" size="7" value=""/>';
  print '<input name="r'.$r.'c6" type="text" size="40" value=""/>';
?>
<input type="button" value="X" title="delete"
          onclick="for (var i=0;i<7;++i) document.getElementsByName('r<?php print $r ?>c'+i)[0].value=''"/>
<input type="button" value="#" title="activate / deactivate"
          onclick="var v=document.getElementsByName('r<?php print $r ?>c0')[0];
          if (v.value.charAt(0)!='#') v.value='#'+v.value;else v.value=v.value.substring(1); mark('r<?php print $r ?>')"/><br/>
<?php } ?>
<input type="hidden" name="rows" value="<?php print --$r ?>"/>
<input type="button" value="save /etc/crontab & restart crond" style="margin-top:6px" 
onclick="document.getElementById('action').value='save';submit()"/>
<input type="button" value="re-read /etc/crontabs & /var/log/cron.log" style="margin-top:6px" onclick="submit()"/>
Lines: 
<input type="text" value="<?php print $l ?>" name="lines" style="margin-bottom:-1px;height:18px;width:30px"/><br/>
</form><pre>
<?php
system('tail -'.$l.' /var/log/cron.log');
?>
</pre></body></html>
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Allerdings erscheint die 3rd Party Application nicht, obwohl ich die application.cfg eingefügt habe.

Dazu und zu anderem gibt es bereits einen Grundsatzartikel ... Vermutlich musste den Station Manager neu laden (= im Browser refreshen)

itari
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
bitte korrigieren, falls noch falsch: exec('killall crond;crond -l 8 -L /var/log/cron.log');
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
Dazu und zu anderem gibt es bereits einen Grundsatzartikel ... Vermutlich musste den Station Manager neu laden (= im Browser refreshen)
itari
Vielen Dank, jetzt läuft es auch bei mir. Habe mittlerweile den Grundsatzartikel Punkt fuer Punkt umgesetzt und das zuletzt nochmals das application.cgi von DOS auf Unix-Format umgesetzt. Erst dann lief es.
Gruss
Juergen
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
@juergen@net - supi :)
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
Ich hab überlegt, ob ihr es von Vorteil anseht, wenn bestimmte Dateiendungen (.mp3, .wav, .avi usw) nicht zulässig sind ...
Bloss nicht! Nutze Crontab auch als Musikwecker (weshalb das Webinterface ja so hilfreich ist; einfach Zeile raus oder reinkommentieren) und zum Aufzeichnen via streamripper. Da sind gerade extenions wie m3u mp3, ogg, wav an der Tagesordnug.
Vielen Dank!
Gruss
Juergen
 

DSL-Hexe

Benutzer
Mitglied seit
01. Apr 2008
Beiträge
692
Punkte für Reaktionen
4
Punkte
44
Klasse, genau das hat gefehlt. Dabei habe ich gemerkt das der Job vnstat -i eth0 -u nicht ausgeführt wird. Danke. Es fehlt jetzt eigentlich nur noch der Button um den LOG zu löschen.
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
ich habe das crond-Logbuch mit eingebaut (/var/log/cron.log). Wie alle Logbücher kann es grenzenlos wachsen und muss daher von Zeit zu Zeit gekürzt bzw. gelöscht werden.
Dazu würde sich ja beipielsweise
02 01 3 * * root rm /var/log/cron.log /var/log/cron1.log
anbieten. Oder gibt es da Rechteschwierigkeiten, wenn das log vom gleichen cronjob geschrieben und gelöscht wird?

Der Fehler mit den ' und " dürfte verbessert sein.
Ja, ist i.O. Allerdings werden jetzt Kommentrzeilen, die einen Stern * enthalten, verstuemmelt. Da ich einige Zeilen nach Bedarf ein und auskommentiere, sind die dann zernichtet.
Was bedeutet jetzt das Feld mit der Zeilenzahl?
Und könnte man auch dem DS-Manager-Frame entspringen?
vielen Dank und Gruss
Juergen
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Dazu würde sich ja beipielsweise
02 01 3 * * root rm /var/log/cron.log /var/log/cron1.log
anbieten. Oder gibt es da Rechteschwierigkeiten, wenn das log vom gleichen cronjob geschrieben und gelöscht wird?

Das kann man so machen.

Ja, ist i.O. Allerdings werden jetzt Kommentrzeilen, die einen Stern * enthalten, verstuemmelt. Da ich einige Zeilen nach Bedarf ein und auskommentiere, sind die dann zernichtet.

Das kann ich nicht nachvollziehen. Bei mir ist das ok.

Was bedeutet jetzt das Feld mit der Zeilenzahl?

Damit kann die Länge der Logbuchs-Anzeige festgelegt werden.

Und könnte man auch dem DS-Manager-Frame entspringen?

Ja in der application.cfg embedded in popup ändern oder einfach per https://Name_der_DS:50001/phpsrc/crontabs/crontabs.php. Es gibt eine offizielle Anleitung für die 3rd-party-apps zum Download auf der dt. Download-Page von Synology. Man kann z.B. die 3rd-party-apps auch fürs User-Menu freischalten.

itari
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
Ja in der application.cfg embedded in popup ändern [/QUOTE]
Super, so gehts. Mit XGA ist das besser.
Gruss
Juergen
 

DSL-Hexe

Benutzer
Mitglied seit
01. Apr 2008
Beiträge
692
Punkte für Reaktionen
4
Punkte
44
Wenn ich jetzt noch Ahnung von PHP hätte würde ich mir ein Button zum manuellen löschen der cron.log erstellen. ;)
Damit wäre dann das Skript aus meiner Sicht perfekt. :)
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
du lässt ja nicht locker :D

Am Dateianfang einfügen (sozusagen Zeile 2-3)

Rich (BBCode):
<?php
if ($_REQUEST['action'] == 'reset') {$fd=fopen('/var/log/cron.log','w');fclose($fd);}
elseif ($_REQUEST['action'] == 'save') {

und kurz vor Schluss:

Rich (BBCode):
Lines: 
<input type="text" value="<?php print $l ?>" name="lines" 
style="margin-bottom:-1px;height:18px;width:30px"/>
<input type="button" value="reset /var/log/cron.log" style="margin-top:6px" 
onclick="document.getElementById('action').value='reset';submit()"/><br/>
</form><pre>
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
Hmmmh, habe den Eindruck, dass jetzt die cronjobs nicht mehr laufen. Die DS hat heute schon 2 Einsaetze versaeumt.
Gruss Juergen
 

DSL-Hexe

Benutzer
Mitglied seit
01. Apr 2008
Beiträge
692
Punkte für Reaktionen
4
Punkte
44
Vielen Dank Itari das Skript läuft bei mir so wie es soll. :)

Für alle das fertige Skript mit dem Delete Button:
Code:
<?php
if ($_REQUEST['action'] == 'reset') {$fd=fopen('/var/log/cron.log','w');fclose($fd);}
elseif ($_REQUEST['action'] == 'save') {
  $out='';
  for($r=1;$r<=$_REQUEST['rows'];++$r) 
    if ($_REQUEST['r'.$r.'c0']!='') for($c=0;$c<7;++$c) $out.=$_REQUEST['r'.$r.'c'.$c].($c<6?chr(9):chr(10));
  file_put_contents('/etc/crontab', stripslashes($out));
  exec('killall crond;crond -l 8 -L /var/log/cron.log'); 
  }
$filearray=file('/etc/crontab');
$_REQUEST['action'] == '';
$l=isset($_REQUEST['lines'])?$_REQUEST['lines']:20;
?>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>cronjobs</title>
<style>body,input{font:12px Arial;margin-right:1px;margin-bottom:1px}h3{font-family:Arial}
body{background-color:#ddf}pre{font-size:10px;padding:2px;background-color:#eef}</style>
<script>
function mark(r) {
  var e=document.getElementsByName(r+'c0')[0];
  if (e.value.charAt(0)=='#') 
    for (var i=0;i<7;++i) document.getElementsByName(r+'c'+i)[0].style.color='#444';
  else
    for (var i=0;i<7;++i) document.getElementsByName(r+'c'+i)[0].style.color='#090';
}
</script> 
</head><body><h3>CronJobs</h3>
<form method="post" action="cronjobs.php">
<input type="hidden" id="action" name="action" value="">
<?php
$r=0;
foreach($filearray as $rec) {
  $r++; $c=0;$f=explode(chr(9),htmlspecialchars($rec));
  print '<input title="*|0..59: 8 1,3,5 2-5 * */2" name="r'.$r.'c0" type="text" size="8" '.($r==1?'readonly':'').' value="'.$f[0].'"/>';
  print '<input title="*|0..23: 8 1,3,5 2-5 * */2" name="r'.$r.'c1" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[1].'"/>';
  print '<input title="*|1..31: 8 1,3,5 2-5 * */2" name="r'.$r.'c2" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[2].'"/>';
  print '<input title="*|1..12: 8 1,3,5 2-5 * */2" name="r'.$r.'c3" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[3].'"/>';
  print '<input title="*|0..7: so=0/7 sa=6" name="r'.$r.'c4" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[4].'"/>';
  print '<input name="r'.$r.'c5" type="text" size="7" '.($r==1?'readonly':'').' value="'.$f[5].'"/>';
  print '<input name="r'.$r.'c6" type="text" size="40" '.($r==1?'readonly':'').' value="'.$f[6].'"/>';
  if ($r>1) {
    print '<script>mark("r'.$r.'")</script>';
?>
<input type="button" value="X" title="delete"
          onclick="for (var i=0;i<7;++i) document.getElementsByName('r<?php print $r ?>c'+i)[0].value=''"/>
<input type="button" value="#" title="activate / deactivate"
          onclick="var v=document.getElementsByName('r<?php print $r ?>c0')[0];
          if (v.value.charAt(0)!='#') v.value='#'+v.value;else v.value=v.value.substring(1); mark('r<?php print $r ?>')"/>
<?php }
  print '<br/>';                   
  }
$rmax=2+$r++;
for($r;$r<=$rmax;$r++) {
  print '<input title="*|0..59: 8 1,3,5 2-5 * */2" name="r'.$r.'c0" type="text" size="8" value=""/>';
  print '<input title="*|0..23: 8 1,3,5 2-5 * */2" name="r'.$r.'c1" type="text" size="7" value=""/>';
  print '<input title="*|1..31: 8 1,3,5 2-5 * */2" name="r'.$r.'c2" type="text" size="7" value=""/>';
  print '<input title="*|1..12: 8 1,3,5 2-5 * */2" name="r'.$r.'c3" type="text" size="7" value=""/>';
  print '<input title="*|0..7: so=0/7 sa=6" name="r'.$r.'c4" type="text" size="7" value=""/>';
  print '<input name="r'.$r.'c5" type="text" size="7" value=""/>';
  print '<input name="r'.$r.'c6" type="text" size="40" value=""/>';
?>
<input type="button" value="X" title="delete"
          onclick="for (var i=0;i<7;++i) document.getElementsByName('r<?php print $r ?>c'+i)[0].value=''"/>
<input type="button" value="#" title="activate / deactivate"
          onclick="var v=document.getElementsByName('r<?php print $r ?>c0')[0];
          if (v.value.charAt(0)!='#') v.value='#'+v.value;else v.value=v.value.substring(1); mark('r<?php print $r ?>')"/><br/>
<?php } ?>
<input type="hidden" name="rows" value="<?php print --$r ?>"/>
<input type="button" value="save /etc/crontab & restart crond" style="margin-top:6px" 
onclick="document.getElementById('action').value='save';submit()"/>
<input type="button" value="re-read /etc/crontabs & /var/log/cron.log" style="margin-top:6px" onclick="submit()"/>
Lines: 
<input type="text" value="<?php print $l ?>" name="lines" 
style="margin-bottom:-1px;height:18px;width:30px"/>
<input type="button" value="reset /var/log/cron.log" style="margin-top:6px" 
onclick="document.getElementById('action').value='reset';submit()"/><br/>
</form><pre>
<?php
system('tail -'.$l.' /var/log/cron.log');
?>
</pre></body></html>

Hmmmh, habe den Eindruck, dass jetzt die cronjobs nicht mehr laufen. Die DS hat heute schon 2 Einsaetze versaeumt.
Gruss Juergen
Das hatte ich auch, ich hatte den Code an einer falschen Stelle eingefügt und somit lag es an mir. Aber jetzt an der richtigen Stelle alles i.O. :cool:
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
Das hatte ich auch, ich hatte den Code an einer falschen Stelle eingefügt und somit lag es an mir. Aber jetzt an der richtigen Stelle alles i.O. :cool:
Das verstehe ich jetzt nicht. Hatte das Originalskript aus dem Post kopiert.
Gruss
Juergen
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
Bei mir laufen tatsaechlich keine cronjobs mehr! crond ist gestartet, ps -f zeigt das auch, cat /var/spool/cron/crontabs/root listet ein vernueftiges Ergebnis, aber es wird nichts mehr gestartet!
Woran kann das liegen?
Vielen Dank!
Gruss
Juergen
 

juergen@net

Benutzer
Mitglied seit
28. Mai 2008
Beiträge
323
Punkte für Reaktionen
0
Punkte
0
crons noch immer tot. In der messages finde ich:
Jul 13 15:36:26 index.cgi: index.cpp (265) There is no text for third party tree node cronjobs

Was soll mir dieses sagen? Hilft mir das, die crons wieder zu bekommen?
Vielen Dank!
Grusss
Juergen
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Das Protokoll des crond (/var/log/cron.log) lässt sich um Datumseinträge ergänzen, in dem man diese einfach auch per crontab in das log-File schreibt.

Also zum Beispiel durch folgende Zeile wird jede Stunde ein Datumeintrag geschrieben:

0<TAB>*<TAB>*<TAB>*<TAB>*<TAB>root<TAB>date >>/var/log/cron.log

Im log-File sieht das dann so aus:
Rich (BBCode):
USER root pid 3067 cmd /usr/local/sbin/DynDNS_update >/dev/null
Wed Sep 10 08:00:01 CEST 2008
USER root pid 3190 cmd /usr/local/sbin/diskstatsd
USER root pid 3192 cmd /usr/local/sbin/netstatsd
USER root pid 3210 cmd /usr/local/sbin/diskstatsd
USER root pid 3212 cmd /usr/local/sbin/netstatsd

itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Code:
[SIZE=1]<?php[/SIZE]
[SIZE=1][COLOR=red]if ($_REQUEST['action'] == 'reset') {$fd=fopen('/var/log/cron.log','w');fclose($fd);}[/COLOR][/SIZE]
[SIZE=1][COLOR=red]else[/COLOR]if ($_REQUEST['action'] == 'save') {[/SIZE]

und kurz vor Schluss:

Code:
[SIZE=1]Lines: [/SIZE]
[SIZE=1]<input type="text" value="<?php print $l ?>" name="lines" [/SIZE]
[SIZE=1]style="margin-bottom:-1px;height:18px;width:30px"/>[/SIZE]
[SIZE=1][COLOR=red]<input type="button" value="reset /var/log/cron.log" style="margin-top:6px" [/COLOR][/SIZE]
[SIZE=1][COLOR=red]onclick="document.getElementById('action').value='reset';submit()"/>[/COLOR]<br/>[/SIZE]
[SIZE=1]</form><pre>[/SIZE]
Und wird diese Bedingung jemals erfüllt wenn JS deaktiviert ist?
 
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