bruno1: PHP-Script im Cronjob

Guten Abend,

Ich bin gerade am verzweifeln...

Ich möchte ein PHP-Script per Cronjob ausführen, um ein Backup meiner MySQL Datenbank zu machen.

Das Script sieht wie folgt aus (Passwort unkenntlich gemacht):

<?php  
$dumpuser = "admin";  
$dumppass = "*****";  
$dumpbase = "bg_main";  
exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $dumpbase . " - " . date("Y.m.d") . ".sql\"");  
?>

Führe ich ihn ganz normal aus, z.B. http://domain.de/backup.php so funktioniert alles.

Nun hab ich das Script aber in den Ordner /var/www/mysql-backup verschoben. Führe ich es nun über SSH mit dem Befehl "php var/www/mysql-backup/backup.php" aus, so funktioniert es auch.

Nun habe ich es in Crontab eingetragen, zum Test "* * * * * php var/www/mysql-backup/backup.php". Aber es liegt nachher im Verzeichnis /var/www/mysql-backup kein Logfile vor.

Laut dem Cronlog müsste aber alles funktioniert haben:

Aug  6 01:31:01 s15430844 crond[1969]: (root) CMD (php var/www/mysql-backup/backup.php)
Aug  6 01:32:01 s15430844 crond[1979]: (root) CMD (php var/www/mysql-backup/backup.php)
Aug  6 01:33:01 s15430844 crond[1984]: (root) CMD (php var/www/mysql-backup/backup.php)
Aug  6 01:34:01 s15430844 crond[1992]: (root) CMD (php var/www/mysql-backup/backup.php)

Nun meine eigentliche Frage, wo liegt das Problem?
Wird die Backupdatei an einem anderen Ort gespeichert?
Wird das PHP-Script abgebrochen, oder ein anderer Fehler in der Crontab?

Und noch eine banahle Frage, die aber vielleicht hilft, wo liegt der PHP-Error-Log? Kann den nähmlich nicht finden, und das Ändern der Einstellungen in der php.ini bringt nix...

bruno1

P.S. Das System ist ein CentOS5 mit Parallels Small Business 10.

  1. Ich hab in meinem Junk-Email-Ordner gerade etwa 120 Mails von der Crontab erhalten, Inhalt:

    Could not open input file: var/www/mysql-backup/backup.php

    Der Ordner hat aber die Rechte 777, muss die Datei diese ebenfalls haben?

    bruno1

    P.S. PHP wird bei mir als FastCGI-Applikation ausgeführt

  2. Hi,

    * * * * * php var/www/mysql-backup/backup.php

    ^ hier fehlt ein /

    setze mal ein "/" an den Anfang des Pfads, also

    * * * * * php /var/www/mysql-backup/backup.php

    Gruß
    Abdul

    1. achso, noch etwas, willst Du wirklich jede Minute ein Backup ausführen?
      Ein bisschen viel, oder? Eigentlich sollte ein tägliches oder stündliches Backup genügen.

      Beispiele:

      An jedem Tag stündlich um 5 Minuten nach der vollen Stunde:
      5 * * * * auszuführender Befehl

      An jedem Tag um 2:17 Uhr
      17 2 * * * auszuführender Befehl

      Gruß
      Abdul

  3. Hi!

    exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >"" . $dumpbase . " - " . date("Y.m.d") . ".sql"");

    Keine Zeichenkodierungsangabe? Willst du das dem Zufall überlassen und damit Datenverlust riskieren?

    Führe ich ihn ganz normal aus, z.B. http://domain.de/backup.php so funktioniert alles.

    Ganz normal ist das auch nicht, denn es ist ebenfalls mehr oder weniger Zufall, dass mysqldump im Pfad steht und gefunden wird.

    Nun hab ich das Script aber in den Ordner /var/www/mysql-backup verschoben. Führe ich es nun über SSH mit dem Befehl "php var/www/mysql-backup/backup.php" aus, so funktioniert es auch.

    Und hier verlässt du dich auch wieder auf den Zufall, dass du dich im Wurzelverzeichnis befindest.

    Nun habe ich es in Crontab eingetragen, zum Test "* * * * * php var/www/mysql-backup/backup.php". Aber es liegt nachher im Verzeichnis /var/www/mysql-backup kein Logfile vor.

    Zwei Zufälle eingebaut. Findest du sie?

    Could not open input file: var/www/mysql-backup/backup.php
    Der Ordner hat aber die Rechte 777, muss die Datei diese ebenfalls haben?

    Nein, denn sie wird ja vom Programm namens php nur gelesen und nicht vom Betriebssystem ausgführt.

    P.S. PHP wird bei mir als FastCGI-Applikation ausgeführt

    Das ist interessant, wenn es um Aufrufe aus dem Apachen geht, aber irrelevant von der Kommandozeile.

    Laut dem Cronlog müsste aber alles funktioniert haben:
    Aug  6 01:31:01 s15430844 crond[1969]: (root) CMD (php var/www/mysql-backup/backup.php)

    Zusammen mit der Fehlermeldung kann man dem nur entnehmen, dass php gefunden wurde.

    Nun meine eigentliche Frage, wo liegt das Problem?

    An zu wenig Absolutismus.

    Und noch eine banahle Frage, die aber vielleicht hilft, wo liegt der PHP-Error-Log?

    (Banal ohne h.) Kommt auf die Konfiguration an.

    Kann den nähmlich nicht finden, und das Ändern der Einstellungen in der php.ini bringt nix...

    Welche änderst du denn? Die für die Kommandozeilenausführung von php oder eine zufällige andere? Apache und Kommandozeile sind unterschiedliche Umgebungen, wofür es sinnvoll ist, sie getrennt zu konfigurieren. php --ini zeigt dir an, welche ini-Dateien gelesen werden. Und mit -c kannst du explizit eine vorgeben.

    Lo!

    1. Hi,

      also um mal ehrlich zu sein, das Script ist nicht von mir, ich beschäftige mich erst seit kurzem mit MySQL, und kenne mich da noch nciht so gut aus.

      Ich sehe ein, dass das Script noch nicht wirklich ausgereift ist. Mich hat es schon beim ersten ansehen gewundert, dass kein Speicherpfad angegeben wurde, da die Datei aber immer in dem Ordner landete, wo das Script ausgeführt wurde, war mir das eigentlich egal.

      Könntest du mir bitte helfen das Script so umzubauen, dass die Zeichenkodierung (UTF-8) und der Pfad (absolut) angegeben werden?
      Außerdem würde ich noch gerne ein Logfile dazu anlegen, aber das müsste einfach mit fwrite gehen, oder?

      Das werde ich später noch alles machen, da ich aber von Crontab eine Fehlermai bekomme, gehe ich davon aus, das schon etwas schief läuft, bevor das Script ausgeführt wird, oder?
      Das ändern des Befehls in * * * * * php /var/www/mysql-backup/backup.php hat auch nichts gebracht, außer, dass die Fehleremail jetzt leer ist.

      Kann es sein, dass die Backupdatei in einem anderen Ordner erstellt wird? Aber dann dürfte doch eigentlich keine Email mehr kommen, oder?

      Zum Error-Log:
      Ich ändere die Einstellungen in /etc/php.ini, standartmäßig ist dort nämlich kein Pfad angegeben, aber wenn ich einen reinschreib, passiert auch nix, weder wenn PHP von der Kommandozeile ausgeführt wird, noch wenn ich in einer Datei für die Homepage einen ; weglasse.

      Mir fällt das noch was ein, Da ich Parallels Plesk verwende, kann ich für jede Homepage PHP neu konfigurieren, sprich ob es als CGI/FastCGI-Applikation, oder als Apache-Modul ausgeführt werden soll.
      Daher weiß ich nicht, welches in der Kommandozeile verwendet wird.

      bruno1

      P.S. Das Script soll später täglich ausgeführt werden, nur zum testen hab ich das minütlich.

      1. Hi!

        Könntest du mir bitte helfen das Script so umzubauen, dass die Zeichenkodierung (UTF-8) und der Pfad (absolut) angegeben werden?

        Absolute Pfadangabe fangen immer mit einem / an. Die mysql-Programme sind im MySQL-Handbuch-Kapitel 4 MySQL Programs beschrieben. mysqldump ist im Kapitel zu den Client-Programmen enthalten.

        Außerdem würde ich noch gerne ein Logfile dazu anlegen, aber das müsste einfach mit fwrite gehen, oder?

        Ja, zuzüglich Datei öffnen und schließen. Beim Schreiben in einem Stück geht es einfacher mit file_put_contents(), das auch an vorhandene Dateien anhängen kann.

        Das werde ich später noch alles machen, da ich aber von Crontab eine Fehlermai bekomme, gehe ich davon aus, das schon etwas schief läuft, bevor das Script ausgeführt wird, oder?

        Ja, es wird wegen der relativen Pfadangabe nicht gefunden.

        Das ändern des Befehls in * * * * * php /var/www/mysql-backup/backup.php hat auch nichts gebracht, außer, dass die Fehleremail jetzt leer ist.

        Gib auch php mit absolutem Pfad an. Wenn du nicht weißt, welcher das ist, hilft dir which php.

        Kann es sein, dass die Backupdatei in einem anderen Ordner erstellt wird? Aber dann dürfte doch eigentlich keine Email mehr kommen, oder?

        Mit einer absoluten Pfadangabe musst du nicht rätselraten.

        Zum Error-Log:
        Ich ändere die Einstellungen in /etc/php.ini, standartmäßig ist dort nämlich kein Pfad angegeben, aber wenn ich einen reinschreib, passiert auch nix, weder wenn PHP von der Kommandozeile ausgeführt wird, noch wenn ich in einer Datei für die Homepage einen ; weglasse.

        Ich sagte doch bereits, wie du überprüfen kannst, welche ini-Dateien gelesen werden. Hast du das berücksichtigt? Kam dabei /etc/php.ini raus? Am besten ist es, wenn du den Test in der Umgebung laufen lässt, in der dein Script auch am Ende laufen soll. Von der Kommandozeile aus ist schön und gut, aber nur für von der Kommandozeile gestartete Programme.

        Mir fällt das noch was ein, Da ich Parallels Plesk verwende,

        ... kann es sein, dass die Cronjobs in einer chroot-Umgebung laufen und dann nur diese und nicht das gesamte System sehen. Dann helfen Symlinks in die chroot-Umgebung oder Dateien kopieren. Ob chroot Anwendung findest, kannst du über crontab -l -u dein_projektspezifischer_user prüfen, wenn dort eine SHELL-Variable gesetzt ist. Die chroot-Umgebung ist dann /var/www/vhosts/dein_projekt.

        kann ich für jede Homepage PHP neu konfigurieren, sprich ob es als CGI/FastCGI-Applikation, oder als Apache-Modul ausgeführt werden soll.
        Daher weiß ich nicht, welches in der Kommandozeile verwendet wird.

        Keins von beiden, wie ich bereits sagte, da CLI != Apache.

        Lo!

        1. Hi,

          Gib auch php mit absolutem Pfad an. Wenn du nicht weißt, welcher das ist, hilft dir which php.

          Ok, der Befehl heißt jetzt:
          "* * * * * /usr/bin/php /var/www/mysql-backup/backup.php"
          Aber es hat sich nichts verändert, immernoch kein Backup file.

          Wie muss ich denn den PHP-Code ändern, dass der Pfad absolut wird?
          Ich versteh das nicht ganz.

          Ich sagte doch bereits, wie du überprüfen kannst, welche ini-Dateien gelesen werden. Hast du das berücksichtigt? Kam dabei /etc/php.ini raus? Am besten ist es, wenn du den Test in der Umgebung laufen lässt, in der dein Script auch am Ende laufen soll. Von der Kommandozeile aus ist schön und gut, aber nur für von der Kommandozeile gestartete Programme.

          Wenn ich php --ini eingebe bleibt Putty hängen, und nix geht mehr.

          ... kann es sein, dass die Cronjobs in einer chroot-Umgebung laufen und dann nur diese und nicht das gesamte System sehen. Dann helfen Symlinks in die chroot-Umgebung oder Dateien kopieren. Ob chroot Anwendung findest, kannst du über crontab -l -u dein_projektspezifischer_user prüfen, wenn dort eine SHELL-Variable gesetzt ist. Die chroot-Umgebung ist dann /var/www/vhosts/dein_projekt.

          Ausgabe von Putty:

          [root@s15430844 ~]# crontab -l -u root
          * * * * * /usr/bin/php /var/www/mysql-backup/backup.php
          9,19,29,39,49,59        *       *       *       *       /usr/lib64/plesk-9.0/postfix-poplockdb-clean
          14,29,44,59     *       *       *       *       /usr/local/psa/admin/sbin/backupmng >/dev/null 2>&1
          ##      0       1       *       *       *       /usr/local/psa/libexec/modules/watchdog/cp/secur-check
          ##      0       1       *       *       *       /usr/local/psa/libexec/modules/watchdog/cp/send-report
          10      1       *       *       *       /usr/local/psa/libexec/modules/watchdog/cp/clean-sysstats
          15      1       *       *       *       /usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats day
          15      1       *       *       1       /usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats week
          15      1       1       *       *       /usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats month
          15      1       1       *       *       /usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats year
          20      1       *       *       *       /usr/local/psa/libexec/modules/watchdog/cp/clean-events
          0       3       *       *       7       /usr/local/psa/libexec/modules/watchdog/cp/clean-reports

          Demnach vermute ich, dass es nicht so ist.
          Sehr interessant finde ich auch, dass ich in /etc/ eine Datei namens Crontab habe, die aber ganz anderst aussieht, und einen Befehl, wenn ich ihn eintrage nicht ausführt.

          bruno1

          1. Hi!

            Ok, der Befehl heißt jetzt:
            "* * * * * /usr/bin/php /var/www/mysql-backup/backup.php"
            Wie muss ich denn den PHP-Code ändern, dass der Pfad absolut wird?

            Genauso.

            Wenn ich php --ini eingebe bleibt Putty hängen, und nix geht mehr.

            Ungünstig. Du kannst aber immerhin noch mit -c eine eigene php.ini angeben.

            Ob chroot Anwendung findest, kannst du über crontab -l -u dein_projektspezifischer_user prüfen, wenn dort eine SHELL-Variable gesetzt ist. Die chroot-Umgebung ist dann /var/www/vhosts/dein_projekt.
            [root@s15430844 ~]# crontab -l -u root

            Ist root dein projektspezifischer Nutzer? Nein, das ist der Superuser, und der hat seine eigene crontab. Der projektspezifische ist der, den du im Plesk bei Hosting angegeben hast. Es ist der, dem unter anderem /var/www/vhosts/projektname/httpdocs gehört.

            Sehr interessant finde ich auch, dass ich in /etc/ eine Datei namens Crontab habe, die aber ganz anderst aussieht, und einen Befehl, wenn ich ihn eintrage nicht ausführt.

            Das ist die vom System, die anderen sind benutzerspezifisch.

            Lo!

        2. Noch eine Ergänzung:

          Auszug aus Putty:

          [root@s15430844 ~]# cd ..
          [root@s15430844 /]# php /usr/bin/php /var/www/mysql-backup/backup.php
          [root@s15430844 /]#

          Aber das Verzeichnis /var/www/mysql-backup/ bleibt bis auf die PHP-Datei leer, kein SQL-Backup.
          Daher schließe ich, dass nun der Fehler an der PHP-Datei liegt.

          Aber warum bekomme ich dann mit Crontab eine Email, vielleicht weil das Script fehlerhaft ist?
          Oder kommt die Email immer, wenn ein Benutzerdefinierter Crontab ausgeführt wird? Wenn dies zutrifft, wie kann ich das auf eine andere Email umleiten, z.B. an crontab@domain.de

          bruno1

          1. Hi!

            [root@s15430844 /]# php /usr/bin/php /var/www/mysql-backup/backup.php

            php und /usr/bin/php ist falsch.

            Aber warum bekomme ich dann mit Crontab eine Email, vielleicht weil das Script fehlerhaft ist?

            Vielleicht weil der Verzeichnispfad nicht existiert.

            Oder kommt die Email immer, wenn ein Benutzerdefinierter Crontab ausgeführt wird?

            Nur, wenn ein Eintrag was ausgibt.

            Wenn dies zutrifft, wie kann ich das auf eine andere Email umleiten, z.B. an crontab@domain.de

            Für "zum Beispiel" gibt es extra dafür vorgesehene Domainnamen, da muss man nicht einfach irgendeinen real existierenden fremden missbrauchen.

            Du willst einen Server administrieren, hast aber so gut wie keine Ahnung davon? Dabei gibt es doch schon genug gekaperte Server, die Müll vertreiben ...

            Erste Regel bei Informationsdefizit: Man(ual)-Page aufrufen.

            man crontab

            bringt noch nicht so viel, verweist aber unter SEE ALSO auf crontab(5). Also zweiter Versuch

            man 5 crontab

            und siehe da, dort wird beschrieben, wie man eine Empfänger-Mail-Adresse einträgt.

            Lo!

            1. Hi,

              ich fasse die beiden Postings mal wieder zu einem zusammen:

              php und /usr/bin/php ist falsch.

              Sorry, war mein Fehler, in der Crontab steht es richtig drin.

              Vielleicht weil der Verzeichnispfad nicht existiert.

              Alle angegebenen Verzeichnisse existieren definitiv.

              Und das mit der Email Frage, tut mir leid, da war ich etwas faul und wollte nicht nach schaun...
              Außerdem möchte ich keine Domain missbrauchen, sondern meine einsetzten.

              Ist root dein projektspezifischer Nutzer? Nein, das ist der Superuser, und der hat seine eigene crontab. Der projektspezifische ist der, den du im Plesk bei Hosting angegeben hast. Es ist der, dem unter anderem /var/www/vhosts/projektname/httpdocs gehört.

              Nein ist er nicht, das wäre dann admin, aber ich bin in Putty mit root angemeldet und führe crontab -e aus, daher beschreibe ich ja nur die root-crontab, oder muss ich die andere nehmen?
              Aber das funktioniert nicht:
              [root@s15430844 ~]# crontab -u admin -e
              crontab:  user `admin' unknown
              [root@s15430844 ~]#
              Daher schließe ich, dass es in die root-crontab eingetragen werden muss.

              Ich habe gerade noch was getestet, die php Datei wird ausgeführt, nur das MySQL-Backup funktioniert nicht, also liegt es am PHP-Script, aber was ist daran falsch?
              Hab den Code gerade mal geändert, für einen absoluten Pfad:

              <?php  
              $datei = fopen("/var/www/test.txt","a");  
              fwrite($datei, "Test");  
              fclose($datei);  
              $dumpuser = "admin";  
              $dumppass = "*****";  
              $dumpbase = "bg_main";  
              $pfad = "/var/www/mysql-backup/";  
              exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $pfad.$dumpbase . " - " . date("Y.m.d") . ".sql\"");  
              ?>
              

              Damit funktioniert jetzt alles, aber ich bekomme trotzdem eine Email, OHNE Inhalt, warum das?

              Außerdem könntest du mir bitte sagen wie ich PHP sage, dass die Datei UTF-8 codiert sein soll?

              bruno1

              1. Hi!

                Vielleicht weil der Verzeichnispfad nicht existiert.
                Alle angegebenen Verzeichnisse existieren definitiv.

                Bist du sicher und beachtest den Unterschied zwischen absoluter und relativer Angabe (foo/bar ist nur von der Wurzel aus gleich /foo/bar) sowie zwischen dem System an sich und einer chroot-Umgebung?

                Der projektspezifische ist der, den du im Plesk bei Hosting angegeben hast. Es ist der, dem unter anderem /var/www/vhosts/projektname/httpdocs gehört.

                [root@s15430844 ~]# crontab -u admin -e
                crontab:  user `admin' unknown

                Bist du sicher, dass admin der richtige ist? Plesk kennt zwei Nutzer, einen mit Zugang zum Verwaltungspanel und ein anderer wird für das Hosting verwendet. Da letzterem einige Verzeichnisse und Dateien gehören, muss er im System existieren. Wenn der nicht crontaben darf, hätte ich eine Meldung erwartet, deren Text auf ein Berechtigungsproblem hinweist, nicht auf eine Nichtexistenz.

                Daher schließe ich, dass es in die root-crontab eingetragen werden muss.

                Wenn du das unter dem root laufen lassen willst, dann ja. Aber ist das denn notwendig und sinnvoll?

                Wenn du etwas von den Hinweisen nicht verstehst, die ich gebe, frag bitte nach und ignoriere nicht die Häfte davon. Sonst kommen wir gar nicht oder nur umständlich ans Ziel.

                Ich habe gerade noch was getestet, die php Datei wird ausgeführt, nur das MySQL-Backup funktioniert nicht, also liegt es am PHP-Script, aber was ist daran falsch?
                exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >"" . $pfad.$dumpbase . " - " . date("Y.m.d") . ".sql"");

                exec() stellt die Ausgabe inklusive der darin enthaltenen Fehlermeldungen zur Verfügung. Die letzte Zeile davon ist das Funktionsergebnis, die komplette Ausgabe bekommt man über den zweiten Funktionsparameter zu sehen. Was steht dort drin?

                Damit funktioniert jetzt alles, aber ich bekomme trotzdem eine Email, OHNE Inhalt, warum das?

                Dein PHP-Script erzeugt vermutlich nur eine Ausgabe mit Whitespace, vielleicht ein Zeilenumbruch nach dem schließenden ?>. Wenn nach dem PHP-Code in einer Datei nichts mehr kommt, kann man das ?> ganz weglassen. Dann können sich dahinter auch keine Whitespaces unbemerkt ansammeln.

                Außerdem könntest du mir bitte sagen wie ich PHP sage, dass die Datei UTF-8 codiert sein soll?

                mysqldump kennt einen Parameter namens default-charset oder so ähnlich. Lies bitte die genaue Schreibweise auf der bereits erwähnten Handbuchseite nach. Beachte bei einem Import, diesen Parameter ebenfalls anzugeben, sonst geht's unter Umständen schief.

                Lo!

                1. Hi,

                  Bist du sicher und beachtest den Unterschied zwischen absoluter und relativer Angabe (foo/bar ist nur von der Wurzel aus gleich /foo/bar) sowie zwischen dem System an sich und einer chroot-Umgebung?

                  Das habe ich am Anfang nicht gemacht, und vermutlich ging es deshalb schief. Jetzt passt aber alles.

                  Bist du sicher, dass admin der richtige ist? Plesk kennt zwei Nutzer, einen mit Zugang zum Verwaltungspanel und ein anderer wird für das Hosting verwendet. Da letzterem einige Verzeichnisse und Dateien gehören, muss er im System existieren. Wenn der nicht crontaben darf, hätte ich eine Meldung erwartet, deren Text auf ein Berechtigungsproblem hinweist, nicht auf eine Nichtexistenz.

                  admin ist der Benutzer zum Verwaltungspanel von Plesk, root der für das Parallels Power Panel, in dem ich Zugriff auf sämtliche Servereinstellungen habe, ansonsten habe ich in Plesk nur noch den FTP user (lukas), aber das geht auch nicht:
                  [root@s15430844 ~]# crontab -u lukas -e
                  no crontab for lukas - using an empty one

                  Wenn du etwas von den Hinweisen nicht verstehst, die ich gebe, frag bitte nach und ignoriere nicht die Häfte davon. Sonst kommen wir gar nicht oder nur umständlich ans Ziel.

                  OK, werde ich in Zukunft versuchen. Ich bin ein eher ungeduldiger Mensch, und wenn etwas nicht so tut wie es sollte, dann verwerf ich das schnell wieder.

                  exec() stellt die Ausgabe inklusive der darin enthaltenen Fehlermeldungen zur Verfügung. Die letzte Zeile davon ist das Funktionsergebnis, die komplette Ausgabe bekommt man über den zweiten Funktionsparameter zu sehen. Was steht dort drin?

                  Was it der zwie Funkionspramter?
                  »»string exec ( string $command [, array &$output [, int &$return_var ]] )
                  Vielleicht $return_var?

                  Dein PHP-Script erzeugt vermutlich nur eine Ausgabe mit Whitespace, vielleicht ein Zeilenumbruch nach dem schließenden ?>. Wenn nach dem PHP-Code in einer Datei nichts mehr kommt, kann man das ?> ganz weglassen. Dann können sich dahinter auch keine Whitespaces unbemerkt ansammeln.

                  Sicher? Also ich hab nach ?> nix gefunden, außerdem beende ich die Funktion mit exit(); ,  aber auch wenn ich das weglasse bekomme ich die Email.
                  Darf man ?> überhaupt weglassen? Eigentlich nicht, oder?

                  Hier der Code:

                  <?php  
                  set_time_limit(900); // 15 Minuten maximal ausführen  
                  error_reporting(E_ERROR); // Nuz Fatal-Errors melden  
                  ini_set("display_errors", 'ON'); // Errors per E-Mail versenden  
                  $timestamp=time();  
                  $datum = date("Y.m.d",$timestamp);  
                  $uhrzeit = date("H:i:s",$timestamp);  
                  $jetzt=$datum.'-'.$uhrzeit;  
                  $datei = fopen("/var/www/mysqlbackup-log","a");  
                  fwrite($datei, "\n ### ".$jetzt.": ");  
                  fwrite($datei, "MySQL-Backup:");  
                  $dumpuser = "admin";  
                  $dumppass = "*****";  
                  $dumpbase = "bg_main";  
                  $pfad = "/var/www/mysql-backup/";  
                  exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $pfad.$dumpbase . " - " . $jetzt . ".sql\"");  
                  rewind($datei);  
                  fwrite($datei, " ERLEDIGT! ");  
                  // Hier kommen später noch weitere Funktionen hin  
                  fclose($datei);  
                  exit();  
                  ?>
                  

                  Ob ich die ersten drei Zeilen schreibe, oder nicht, es kommt immer eine leere Email.

                  Die UTF-8 Codierung bau ich später noch ein, ich hab jetzt nur keine Zeit mehr.

                  Es wäre schön, wenn wir den Fehler, der die Email verursacht noch finden würden, aber ich glaube notfalls kann ich mit einer Email am Tag leben.

                  bruno1

                  1. Hi!

                    admin ist der Benutzer zum Verwaltungspanel von Plesk, root der für das Parallels Power Panel, in dem ich Zugriff auf sämtliche Servereinstellungen habe, ansonsten habe ich in Plesk nur noch den FTP user (lukas), aber das geht auch nicht:
                    [root@s15430844 ~]# crontab -u lukas -e
                    no crontab for lukas - using an empty one

                    Dann schau doch jetzt bitte mal nach, wem außer root Verzeichnisse und Dateien in deinem Projektverzeichnis /var/www/vhosts/... gehören.

                    exec() stellt die Ausgabe inklusive der darin enthaltenen Fehlermeldungen zur Verfügung. Die letzte Zeile davon ist das Funktionsergebnis, die komplette Ausgabe bekommt man über den zweiten Funktionsparameter zu sehen. Was steht dort drin?

                    Was it der zwie Funkionspramter?
                    »»string exec ( string $command [, array &$output [, int &$return_var ]] )
                    Vielleicht $return_var?

                    Nee, das ist der dritte. exec('command', $output); und anschließend print_r($output) wäre zielführend. $returnvar ist vom Typ int, da passt wohl eher kein Ausgabetext rein.

                    Dein PHP-Script erzeugt vermutlich nur eine Ausgabe mit Whitespace, vielleicht ein Zeilenumbruch nach dem schließenden ?>. Wenn nach dem PHP-Code in einer Datei nichts mehr kommt, kann man das ?> ganz weglassen. Dann können sich dahinter auch keine Whitespaces unbemerkt ansammeln.
                    Sicher? Also ich hab nach ?> nix gefunden, außerdem beende ich die Funktion mit exit(); ,  aber auch wenn ich das weglasse bekomme ich die Email.

                    Dann weiß ich grad auch nciht, was es ist.

                    Darf man ?> überhaupt weglassen? Eigentlich nicht, oder?

                    Natürlich darf man das weglassen, wenn es am Ende der Datei steht. Es wäre sehr kleinlich von PHP, darauf zu bestehen, wenn durch das Dateiende der Codebereich sowieso endet.

                    $timestamp=time();
                    $datum = date("Y.m.d",$timestamp);
                    $uhrzeit = date("H:i:s",$timestamp);

                    Wenn du date() keinen zweiten Parameter übergibst, wird die aktuelle Zeit genommen.

                    $jetzt=$datum.'-'.$uhrzeit;

                    Außerdem kannst du mit date() auch gleich den kompletten String erzeugen lassen: $jetzt = date("Y.m.d-H:i:s");

                    exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >"" . $pfad.$dumpbase . " - " . $jetzt . ".sql"");

                    Und da nun noch die Ausgabe in Empfang nehmen und anzeigen ...

                    Lo!

                    1. Hi,

                      ich fasse die Postings mal wieder zusammen.

                      Dann schau doch jetzt bitte mal nach, wem außer root Verzeichnisse und Dateien in deinem Projektverzeichnis /var/www/vhosts/... gehören.

                      Die Verzeichnisse gehören entweder root oder dem FTP-User lukas, der keine Crontab hat.

                      Nee, das ist der dritte. exec('command', $output); und anschließend print_r($output) wäre zielführend. $returnvar ist vom Typ int, da passt wohl eher kein Ausgabetext rein.

                      OK; dann passe ich jetzt
                      exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $pfad.$dumpbase . " - " . $jetzt . ".sql\"");
                      an, sprich:

                      exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $pfad.$dumpbase . " - " . $jetzt . ".sql\"" $output);  
                      echo $output;
                      

                      Dann müsste in der nächsten Email $output angezeigt werden.
                      In der Email steht:
                      PHP Parse error:  syntax error, unexpected T_VARIABLE in /var/www/browsergame.php on line 16
                      Daraus schließe ich, dass der Code falsch ist, und passe ihn mal an:

                      exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase" $output);  
                      echo $output;
                      

                      Mal schaun, was passiert.
                      Geht auch nicht, jetzt bin ich überfragt, wie muss der Code lauten?

                      Wenn du date() keinen zweiten Parameter übergibst, wird die aktuelle Zeit genommen.
                      Außerdem kannst du mit date() auch gleich den kompletten String erzeugen lassen: $jetzt = date("Y.m.d-H:i:s");

                      OK, danke, das wusste ich bis jetzt nicht, da kann ich mir eine Menge arbeit ersparen.

                      ANDERER POST:

                      Auch gut. Allerdings kann man diesen Parameter auch durch eine zentrale (/etc/my.cnf) und eine benutzerspezifische (~/my.cnf) Konfiguration vorgeben. Wenn du sicherstellst, dass da keiner was drin bezüglich Kodierung vom Standard (mit d hinten) abweichendes eingetragen hat, dann ist das Weglassen unproblematisch.

                      Da bin ich mir sicher, denn in der Datei hab ich noch nie was geändert, und mein Editor zeigt mir an, dass das Backup UTF-8 codiert sei.

                      bruno1

                      1. Hallo,

                        OK; dann passe ich jetzt
                        exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $pfad.$dumpbase . " - " . $jetzt . ".sql\"");
                        an, sprich:

                        exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >"" . $pfad.$dumpbase . " - " . $jetzt . ".sql"" $output);

                        echo $output;

                        
                        > Dann müsste in der nächsten Email $output angezeigt werden.  
                        > In der Email steht:  
                        > PHP Parse error:  syntax error, unexpected T\_VARIABLE in /var/www/browsergame.php on line 16  
                        > Daraus schließe ich, dass der Code falsch ist  
                          
                        richtig kombiniert.  
                        Und womit trennt man mehrere Parameter in einem Funktionsaufruf? - Richtig, mit einem Komma.  
                        Wo ist das Komma in deinem Beispiel? - Richtig, es fehlt. Wird vielleicht erst morgen geliefert. ;-)  
                          
                        Ciao,  
                         Martin  
                        
                        -- 
                        Man ist so alt, wie man sich fühlt.  
                        Aber niemals so wichtig.  
                        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                        
                        1. Hi,

                          richtig kombiniert.
                          Und womit trennt man mehrere Parameter in einem Funktionsaufruf? - Richtig, mit einem Komma.
                          Wo ist das Komma in deinem Beispiel? - Richtig, es fehlt. Wird vielleicht erst morgen geliefert. ;-)

                          Ups, da ist mir wohl ein kleiner Flüchtigkeitsfehler unterlaufen...
                          Ich probiers gleich nochmal aus.

                          Inhalt der Email:
                          Array

                          Damit kann ich jetzt aber nicht viel anfangen, ich probiers mal mit var_dump.

                          Inhalt der Email:
                          array(0) {
                          }

                          Also ist der Array leer.
                          Ist er trotzdem für die Ausgabe verantwortlich?
                          Dann müsste doch unset($output); helfen, oder?

                          Zu mindest tut es das bei mir, ich bekomme keine Email mehr.
                          Dann war ein leerer Array das Problem...

                          Vielen Dank für eure Hilfe.

                          bruno1

                          1. Hi!

                            Damit kann ich jetzt aber nicht viel anfangen, ich probiers mal mit var_dump.

                            Ja, Arrays im Ganzen auszugeben geht nur mit var_dump() oder print_r().

                            Also ist der Array leer.

                            Dann hat mysqldump nichts erzählt. Um sicher zu gehen, kannst du noch einen dritten Parameter angeben (natürlich mit Komma getrennt) und den ausgeben (am besten auch mit var_dump()). Der sollte 0 ergeben und im Fehlerfall was anderes.

                            Ist er trotzdem für die Ausgabe verantwortlich?
                            Dann müsste doch unset($output); helfen, oder?

                            Damit löschst du die Variable wieder - nicht zielführend.

                            mysqldump scheint also ordentlich gearbeitet zu haben. Wenn du die Ausgabe nicht findest, liegt das möglicherweise an einer nicht absoluten Pfadangabe (oder einem chroot). Kommentiere die exec-mysqldump-Zeile mal aus und schreib ein

                            exec("touch /tmp/foobarqux", $output, $returncode);
                              var_dump($returncode);
                              var_dump($output);

                            Wenn keine Meldungen zu sehen sind, solltest du die Datei finden können (rm /tmp/foobarqux löscht sie wieder). Wenn nicht, lass sie mit dem Midnight Commander suchen. mc ist das Aufrufkommando. Wenn er nicht existiert, installier ihn dir mit yum install mc. Mit F9 ins Menü, dort Command und Find file. Im Dialog bei Filename foobarqux eintragen und einen / bei Start at.

                            Lo!

                            1. Hi,

                              Damit löschst du die Variable wieder - nicht zielführend.

                              Ich weiß, dass ich die Variable damit nur lösche, aber das Problem hat sich dadurch gelöst. Ich habe heute Nacht, als das Script ausgeführt wurde, erfolgreich, keine Email bekommen.

                              mysqldump scheint also ordentlich gearbeitet zu haben. Wenn du die Ausgabe nicht findest, liegt das möglicherweise an einer nicht absoluten Pfadangabe (oder einem chroot). Kommentiere die exec-mysqldump-Zeile mal aus und schreib ein

                              exec("touch /tmp/foobarqux", $output, $returncode);
                                var_dump($returncode);
                                var_dump($output);

                              Meldung in der Email:
                              int(0)
                              array(0) {
                              }

                              Wenn keine Meldungen zu sehen sind, solltest du die Datei finden können (rm /tmp/foobarqux löscht sie wieder).

                              Die Datei ist vorhanden, und ich vermute, wenn ich beide Variablen mit unset gelöscht hätte, dann wäre keine Email gekommen.

                              bruno1

                              P.S. Woher weißt du, dass ich den Server von 1und1 hab?

                              1. Hi!

                                Ich weiß, dass ich die Variable damit nur lösche, aber das Problem hat sich dadurch gelöst. Ich habe heute Nacht, als das Script ausgeführt wurde, erfolgreich, keine Email bekommen.

                                Die Mail hängt nicht vom Vorhandensein von Variablen ab. Sie kommt durch eine Ausgabe zustande, wobei exec() allein nichts ausgibt.

                                Meldung in der Email:
                                int(0)
                                array(0) {
                                }

                                Sieht nach keinen Fehlern aus. Was ist denn der aktuelle Stand? Wird das Backup über Cronjob erzeugt oder nur beim Direktaufruf an der Kommandozeile?

                                P.S. Woher weißt du, dass ich den Server von 1und1 hab?

                                Am typischen Rechnernamen erraten, den du in einem deiner Postings gecopy'n'pastet hast.

                                Lo!

                                1. Hi,

                                  Die Mail hängt nicht vom Vorhandensein von Variablen ab. Sie kommt durch eine Ausgabe zustande, wobei exec() allein nichts ausgibt.

                                  Ich finde das auch merkwürdig aber wenn ich die $output von exec mit unset lösche, dann kommt keine Email mehr.

                                  Sieht nach keinen Fehlern aus. Was ist denn der aktuelle Stand? Wird das Backup über Cronjob erzeugt oder nur beim Direktaufruf an der Kommandozeile?

                                  Der Cronjob wird mit folgendem Script komplett, fehlerfrei und ohne eine Email ausgeführt:

                                  <?php  
                                  set_time_limit(900); // 15 Minuten maximal ausführen  
                                  error_reporting(E_ALL); // Errors melden  
                                  ini_set("display_errors", 'ON'); // Errors per E-Mail versenden  
                                  $timestamp=time();  
                                  $datum = date("Y.m.d",$timestamp);  
                                  $uhrzeit = date("H:i:s",$timestamp);  
                                  $jetzt=$datum.'-'.$uhrzeit;  
                                  $datei = fopen("/var/www/log","a");  
                                  fwrite($datei, "\n ### ".$jetzt.": ");  
                                  fwrite($datei, "MySQL-Backup:");  
                                  $dumpuser = "admin";  
                                  $dumppass = "*****";  
                                  $dumpbase = "bg_main";  
                                  $pfad = "/var/www/mysql-backup/";  
                                  exec( "mysqldump --user=$dumpuser --password=$dumppass --add-drop-table $dumpbase >\"" . $pfad.$dumpbase . " - " . $jetzt . ".sql\"", $output);  
                                  unset($output);  
                                  rewind($datei);  
                                  fwrite($datei, " abgeschlossen! ");  
                                  // Später kommen hier noch weitere Funktionen hin  
                                  fclose($datei);  
                                  exit();  
                                  ?>  
                                  
                                  

                                  Am typischen Rechnernamen erraten, den du in einem deiner Postings gecopy'n'pastet hast.

                                  Aha.

                                  Für mich wäre das Problem dann soweit abgeschlossen, denn ich bin mit dem Script zufrieden. Wenn du daran noch irgendetwas auszusetzen hast sag es, bitte.

                                  Ansonsten noch vielen Dank an alle, die mir bei der Lösung des Problemes geholfen haben.

                                  bruno1

                                  P.S. Nur falls es dich interessiert, in Prallels Small Business 10 kann man über "Server", "Erweiterte Einstellungen" und "Geplante Aufgaben" die Cronjobs für alle Benutzer konfigurieren.

                                  Hier eine Liste aller Benutzer:

                                  adm
                                  apache
                                  bin
                                  daemon
                                  dbus
                                  distcache
                                  drweb
                                  ftp
                                  games
                                  gopher
                                  halt
                                  lp
                                  mail
                                  mailnull
                                  mhandlers-user
                                  mysql
                                  named
                                  news
                                  nobody
                                  nscd
                                  ntp
                                  operator
                                  pcap
                                  popuser
                                  postfix
                                  psaadm
                                  psaftp
                                  root
                                  rpc
                                  shutdown
                                  smmsp
                                  sshd
                                  sw-cp-server
                                  sync
                                  uucp
                                  vcsa

                                  Meine ist jetzt bei root eingetragen, welchen Benutzer müsste ich denn nehmen, um den Cronjob als "normaler" User auszuführen?

                                  1. Hi!

                                    Für mich wäre das Problem dann soweit abgeschlossen, denn ich bin mit dem Script zufrieden. Wenn du daran noch irgendetwas auszusetzen hast sag es, bitte.

                                    Zwei Dinge sagte ich ja schon (date() und ?>) ansonsten kannst du das $output (nebst Komma) im exec() wieder entfernen, wenn die Fehlersuche soweit abgeschlossen ist. Besser wäre es jedoch, es zu behalten und den Inhalt in deine Log-Datei zu schreiben

                                    echo print_r($output, true);

                                    Hier eine Liste aller Benutzer:
                                    [...]

                                    Der lukas ist ja gar nicht mit dabei.

                                    Meine ist jetzt bei root eingetragen, welchen Benutzer müsste ich denn nehmen, um den Cronjob als "normaler" User auszuführen?

                                    Eigentlich den lukas, unter dem ja auch das Webzeugs läuft. Alternativ auch einen anderen, den du anlegen kannst.

                                    Lo!

                                    1. Hi,

                                      Zwei Dinge sagte ich ja schon (date() und ?>) ansonsten kannst du das $output (nebst Komma) im exec() wieder entfernen, wenn die Fehlersuche soweit abgeschlossen ist. Besser wäre es jedoch, es zu behalten und den Inhalt in deine Log-Datei zu schreiben

                                      Wenn ich $output und dessen unset wieder entferne bekomme ich eine leere Email, deshalb lasse ich es.
                                      Ansonsten Danke für deine Hilfe und ich werde die anderen Sachen noch schnell anpassen.

                                      Danke

                                      bruno1

                      2. Hi!

                        Dann schau doch jetzt bitte mal nach, wem außer root Verzeichnisse und Dateien in deinem Projektverzeichnis /var/www/vhosts/... gehören.
                        Die Verzeichnisse gehören entweder root oder dem FTP-User lukas, der keine Crontab hat.

                        Verzeichnisse haben mit FTP nichts am Hut. Wenn die dem lukas gehören, dannist das ein Useraccount im System. Wenn dein FTP-Server den selben verwendet oder eine eigene Benutzerverwaltung mit dem selben Namen, dann sind das trotzdem zwei Paar Schuhe.

                        Wenn der lukas keine hat, dann richte ihm über Plesk eine ein. Ich weiß nicht, welche Version du hast, aber in der nicht abgespeckten 10.x geht das über das Control Panel, Websites, Advanced, Scheduled Tasks.

                        Lo!

                        1. Hi!

                          Ich weiß nicht, welche Version du hast, aber in der nicht abgespeckten 10.x geht das über das Control Panel, Websites, Advanced, Scheduled Tasks.

                          Ah, Small Business 10 sagtest du. Da weiß ich nicht, wo das versteckt ist, da ich mit der "Vollversion" arbeite. Wechseln geht bei 1&1 aber nur mit einer Server-Neuinstallation.

                          Lo!

                          1. Ja, das geht nur mit einer Neuinstallation, und das möchte ich nicht mehr machen, da dann doch eine Menge Einstellungen weg sind.

                            Ich würde das gerne jetzt so belassen, und mich mit der funktionierenden Crontab zufrieden geben, sonst kann ich mit crontab -e ja eine weitere anlegen.

                            bruno1

                2. Nochmal ein kleiner Nachtrag (Hab mich um eine Stunde vertan, un deshalb noch etwas Zeit):

                  »»--default-character-set=charset_name
                  »»Use charset_name as the default character set. See Section 9.5, “Character Set Configuration”. If no character set is specified, mysqldump uses utf8, and earlier versions use latin1.

                  Wenn ich das richtig verstanden habe benutzt mysqldump standartmäßig UTF-8, jetzt ist es doch nur noch wichtig exec() zu sagen, dass es die Datei im UTF-8 Format speichert, oder geht das auch automatisch?

                  Oder muss man hier noch was machen?:

                  »»--set-charset
                  »»Add SET NAMES default_character_set to the output. This option is enabled by default. To suppress the SET NAMES statement, use --skip-set-charset.

                  bruno1

                  1. Hi!

                    »»--default-character-set=charset_name
                    »»Use charset_name as the default character set. See Section 9.5, “Character Set Configuration”. If no character set is specified, mysqldump uses utf8, and earlier versions use latin1.
                    Wenn ich das richtig verstanden habe benutzt mysqldump standartmäßig UTF-8, [...]

                    Auch gut. Allerdings kann man diesen Parameter auch durch eine zentrale (/etc/my.cnf) und eine benutzerspezifische (~/my.cnf) Konfiguration vorgeben. Wenn du sicherstellst, dass da keiner was drin bezüglich Kodierung vom Standard (mit d hinten) abweichendes eingetragen hat, dann ist das Weglassen unproblematisch.

                    [...] jetzt ist es doch nur noch wichtig exec() zu sagen, dass es die Datei im UTF-8 Format speichert, oder geht das auch automatisch?

                    Die Datei erzeugt ja mysqldump, also müsste es dem gesagt werden, aber siehe oben.

                    Oder muss man hier noch was machen?:
                    »»--set-charset
                    »»Add SET NAMES default_character_set to the output. This option is enabled by default. To suppress the SET NAMES statement, use --skip-set-charset.

                    Damit wird festgelegt, ob am Anfang des Dumps ein SET NAMES-Statement als Kommentar eingefügt wird. Das kannst du so lassen.

                    Lo!