{"id":6917,"date":"2012-04-22T18:16:03","date_gmt":"2012-04-22T16:16:03","guid":{"rendered":"https:\/\/www.gambaru.de\/blog\/?p=6917"},"modified":"2019-10-09T02:45:45","modified_gmt":"2019-10-09T00:45:45","slug":"cron-und-logrotate-ein-beispiel-anhand-eines-spieleservers","status":"publish","type":"post","link":"https:\/\/gambaru.de\/blog\/2012\/04\/22\/cron-und-logrotate-ein-beispiel-anhand-eines-spieleservers\/","title":{"rendered":"Cron und Logrotate: Ein Beispiel anhand eines Spieleservers"},"content":{"rendered":"<p>Genauso unabdingbar wie Liebe und guter Wein f\u00fcr Goethe waren, sind Cron und Logrotate das Lebenselixier f\u00fcr jeden Serveradmin. Vielleicht etwas \u00fcbertrieben formuliert, aber auch nur fast. \ud83d\ude42 Als \"normaler\" Linuxnutzer kommt man nur sehr selten direkt mit den beiden in Ber\u00fchrung, da in der Regel einfach alles l\u00e4uft.<br \/>\nNur am Rande bemerkt: Wer an Debians und Ubuntus \"<a href=\"http:\/\/popcon.debian.org\/\">Popularity Contest<\/a>\" teilnimmt und ihn nicht auf einem Server laufen l\u00e4sst, sollte auf jeden Fall noch <a href=\"http:\/\/packages.debian.org\/anacron\">anacron<\/a> installiert haben, da das Senden der Berichte zu wechselnden Tageszeiten erfolgt und man unter Umst\u00e4nden den Rechner dann nicht eingeschaltet hat, weswegen der Cron-Job nicht ausgef\u00fchrt werden kann.<br \/>\nIm Gegensatz zu Anacron arbeitet Cron pr\u00e4zise zu einem bestimmten Zeitpunkt Auftr\u00e4ge ab und setzt damit voraus, dass der Rechner kontinuierlich verf\u00fcgbar ist. Im Zusammenspiel mit Logrotate, das Logdateien nach einem vorgegebenen Zeitintervall verschieben und komprimieren kann, ist er \u00e4u\u00dferst wichtig und n\u00fctzlich f\u00fcr jeden Server.<\/p>\n<h2>Logrotate-Beispiel anhand von OpenArena<\/h2>\n<p>Der OpenArena-Server speichert den Verlauf der Spiele in der Logdatei <em>games.log<\/em>. Hierf\u00fcr habe ich eine neue Konfigurationsdatei in <em>\/etc\/logrotate.d\/<\/em> angelegt, die wie folgt aufgebaut ist.<\/p>\n<pre class=\"brush:shell\">\/home\/openarena\/.openarena\/baseoa\/games.log {\n        daily\n        missingok\n        rotate 14\n        compress\n        delaycompress\n        notifempty\n        create 644 openarena openarena\n        sharedscripts\n        postrotate\n                if [ -x \/usr\/sbin\/invoke-rc.d ]; then\n                        invoke-rc.d oa_ded restart &gt; \/dev\/null 2&gt;&amp;1;\n                else\n                        \/etc\/init.d\/oa_ded restart &gt; \/dev\/null 2&gt;&amp;1;\n                fi;\n        endscript\n}<\/pre>\n<p>Die Syntax ist sehr logisch.<\/p>\n<ul>\n<li>Wann soll rotiert werden? Alternativen sind weekly und monthly<\/li>\n<p><strong>daily<\/strong><\/p>\n<li>Sollte die Logdatei nicht vorhanden sein, ignoriere den Fehler und gehe zur n\u00e4chsten Datei.<\/li>\n<p><strong>missingok<\/strong><\/p>\n<li>Wie oft werden Logdateien rotiert? In diesem Fall werden f\u00fcr jeden Tag f\u00fcr insgesamt 14 Tage Logdateien vorgehalten. Am 15. Tag w\u00fcrde also die \u00e4lteste Logdatei \u00fcberschrieben werden. W\u00e4re z.B. <em>weekly<\/em> und <em>rotate 8<\/em> eingestellt, w\u00fcrde die Logdatei jede Woche f\u00fcr insgesamt 8 Wochen rotiert.<\/li>\n<p><strong>rotate 14<\/strong><\/p>\n<li>Um Platz zu sparen sollten die Dateien mit gzip komprimiert werden.<\/li>\n<p><strong>compress<\/strong><\/p>\n<li>Verz\u00f6gere die Kompression um einen Rotationszyklus, da manche Programme noch in die letzte Logdatei schreiben k\u00f6nnen. Dadurch ist <em>games.log.1<\/em> immer unkomprimiert.<\/li>\n<p><strong>delaycompress<\/strong><\/p>\n<li>Wenn die Datei leer ist, soll gar nichts gemacht werden.<\/li>\n<p><strong>notifempty<\/strong><\/p>\n<li>Eine neue games.log wird automatisch mit den Dateirechten 644 und Benutzer und Gruppe openarena erzeugt.<\/li>\n<p><strong>create 644 openarena openarena<\/strong><\/p>\n<li>Normalerweise wird die Anweisung prerotate und postrotate bei jeder Logdatei ausgef\u00fchrt, also wenn anstelle von games.log z.B. eine Wildcard wie *.log angegeben worden w\u00e4re. In diesem Fall nicht entscheidend, sondern nur zur Sicherheit.<\/li>\n<p><strong>sharedscripts<\/strong><\/p>\n<li>Mit dem letzten Kommando <strong>postrotate<\/strong> kann eine Aktion nach der durchgef\u00fchrten Logrotation ausgef\u00fchrt werden. In meinem Fall starte ich danach den Server immer neu. Das hat den zus\u00e4tzlichen Vorteil, dass eventuell durch Spieler ge\u00e4nderte Servervariablen wieder auf die Standardwerte zur\u00fcckgesetzt werden. F\u00fcr den Teeworlds-Server war ein Neustart sogar notwendig, da er ansonsten nicht in die neue Logdatei geschrieben hat.<\/li>\n<\/ul>\n<p>Weitere Ideen und Anregungen finden sich im Verzeichnis <em>\/etc\/logrotate.d\/<\/em> und nat\u00fcrlich mit <strong>man logrotate<\/strong>. Die Konfigurationsdatei f\u00fcr logrotate ist <em>\/etc\/logrotate.conf<\/em>.<\/p>\n<h2>Cron in K\u00fcrze<\/h2>\n<p>Cron ist das Herzst\u00fcck jedes Servers. Er arbeitet zeitgesteuert alle Shellskripte in <em>\/etc\/cron.hourly<\/em>, <em>\/etc\/cron.daily<\/em>, <em>\/etc\/cron.weekly<\/em> und <em>\/etc\/cron.monthly<\/em> ab und wertet die Informationen in <em>\/etc\/crontab<\/em> und den jeweiligen crontabs aus. Cron muss nicht neugestartet werden, wenn eine Einstellung ver\u00e4ndert wird.<br \/>\nIn meiner <em>\/etc\/crontab<\/em> habe ich z.B so etwas stehen:<\/p>\n<pre class=\"brush:text\"> 05 7    * * *   openarena       \/usr\/local\/bin\/oa_stats_daily.sh &gt; \/dev\/null 2&gt;&amp;1<\/pre>\n<p>Hier wird mit den Rechten des Benutzers openarena ein kleines Skript ausgef\u00fchrt, welches die t\u00e4glichen Statistiken um 7 Uhr und f\u00fcnf Minuten f\u00fcr OpenArena generiert.<br \/>\nMehrere Beispiele f\u00fcr Cron aus der Wikipedia:<\/p>\n<pre class=\"brush:text\">#M    S   T   M  W    Befehl\n5     *   *   *  *    \/usr\/bin\/message.sh     #Befehl wird f\u00fcnf Minuten nach jeder vollen Stunde aufgerufen.\n*\/5   *   *   *  *    \/usr\/bin\/message.sh     #Befehl wird alle 5 Minuten aufgerufen (die Schrittweite wird durch *\/Schrittweite angegeben).\n59    23  *   *  0    gzip \/var\/log\/messages  #Befehl wird einmal pro Woche sonntags um 23:59 Uhr ausgef\u00fchrt.\n0     0   *   *  *    gzip \/var\/log\/auth.log  #Befehl wird t\u00e4glich um 00:00 Uhr ausgef\u00fchrt.\n20,30 1   *   *  1-5  \/usr\/bin\/work.sh        #Befehl wird montags bis freitags jeweils um 01:20 und 01:30 ausgef\u00fchrt.\n0     1   1-7 12 1    \/usr\/bin\/work.sh        #Befehl wird am 1. bis 7. Dezember sowie an jedem Montag im Dezember um ein Uhr nachts ausgef\u00fchrt.<\/pre>\n<p>Aus Sicherheitsgr\u00fcnden kann man die Erlaubnis f\u00fcr Cron-Jobs einschr\u00e4nken, indem eine Datei <em>\/etc\/cron.allow<\/em> mit den berechtigten Benutzern angelegt wird. (Ein Name pro Zeile). Ansonsten darf jeder Benutzer mit Eingabe von <strong>crontab -e<\/strong> seine eigenen Auftr\u00e4ge anlegen.<br \/>\nCron bietet damit neben seinen typischen Aufr\u00e4um- und Pr\u00fcfarbeiten die M\u00f6glichkeit eigene Skripte zeitlich gesteuert auszuf\u00fchren. In Zusammenspiel mit Logrotate lassen sich so ganz leicht Statistiken f\u00fcr den Spieleserver generieren, sofern das Spiel diese \u00fcberhaupt mitloggt. Zu dem genauen Inhalt des Skripts ein anderes Mal mehr.<\/p>\n<h2>Links<\/h2>\n<p><a href=\"http:\/\/de.wikipedia.org\/wiki\/Cron\">http:\/\/de.wikipedia.org\/wiki\/Cron<\/a><br \/>\n<a href=\"http:\/\/linux.die.net\/man\/8\/cron\">http:\/\/linux.die.net\/man\/8\/cron<\/a><br \/>\n<a href=\"http:\/\/www.debian-administration.org\/articles\/56\">http:\/\/www.debian-administration.org\/articles\/56<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Genauso unabdingbar wie Liebe und guter Wein f\u00fcr Goethe waren, sind Cron und Logrotate das Lebenselixier f\u00fcr jeden Serveradmin. Vielleicht etwas \u00fcbertrieben formuliert, aber auch nur fast. \ud83d\ude42 Als &#8222;normaler&#8220; Linuxnutzer kommt man nur sehr selten direkt mit den beiden in Ber\u00fchrung, da in der Regel einfach alles l\u00e4uft. Nur am Rande bemerkt: Wer an &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/gambaru.de\/blog\/2012\/04\/22\/cron-und-logrotate-ein-beispiel-anhand-eines-spieleservers\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eCron und Logrotate: Ein Beispiel anhand eines Spieleservers\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[48,53,108,112,144],"_links":{"self":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/6917"}],"collection":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/comments?post=6917"}],"version-history":[{"count":1,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/6917\/revisions"}],"predecessor-version":[{"id":10710,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/6917\/revisions\/10710"}],"wp:attachment":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/media?parent=6917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/categories?post=6917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/tags?post=6917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}