Ankündigung

Einklappen
Keine Ankündigung bisher.

Cronjob per PHP erstellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Cronjob per PHP erstellen

    Hallo
    Ich will mir eine Hosting website machen.
    Nur habe ich da noch ein problem. Und zwar soll ja wenn die Server bzw ein Server auslauft soll er automatisch gestoppt werden.

    So da habe ich mir gedacht das geht mit Cronjob bzw ich habs gelesen.
    Ich habe da schon bischen probiert aber leider geht das bis jetzt nicht.

    Problem ist: Er erstellt erst keinen Cronjob

    Fehler: Weiß ich nicht deswegen frage ich

    Was habe ich bis jetzt?
    Cronjob.php eingefügt im header
    PHP-Code:
     <?php
    /**
     * @author Mark Wecke <mark.wecke@googlemail.com>
     */
    class Crontab {
        
    /**
         * Speichert die geparsten Einträge aller eingetragenen Cronjobs des Users
         *
         * @var array
         */
        
    protected $rows = array();

        public function 
    __construct() {
            
    $this->_parse();
        }

        
    /**
         * Liest alle eingetragenen Cronjobs des Users aus und parst sie in ein Array
         */
        
    protected function _parse() {
            
    $rows = array();
            
    exec('crontab -l'$rows);
            
            if(!empty(
    $rows))
            {        
              if(
    substr($rows[0], 010) == 'no crontab') {
                 return;
              }
              foreach(
    $rows AS $row) {
                  
    $this->rows[] = $this->_parseRow($row);
              }
            }
        }  

        
    /**
         * Splittet eine Zeile der Crontab in ein Array auf
         *
         * @param String $row
         * @return Array
         */
        
    protected function _parseRow($row) {
            return 
    preg_split('/\s+/'trim($row), 6);
        }

        
    /**
         * Entfernt alle Whitespaces aus dem Hinzugefügten Cronjob
         * Wird auf alle Felder bis auf das Command Feld angewendet
         *
         * @see Cronjob::add()
         * @param string $cell
         * @return string
         */
        
    protected function _sanitize($cell) {
            return 
    preg_replace('/\s+/'''$cell);
        }

        
    /**
         * Liefert alle Cronjobs als Array
         *
         * @return array
         */
        
    public function getAll() {
            return 
    $this->rows;
        }

        
    /**
         * Findet alle eingetragen Cronjobs die mit den Suchparameters übereinstimmen
         * <dl>
         *  <dt>minute, hoer, dom(day of month), month, dow(day of week), command</dt>
         *  <dd>Sucht in dem entsprechenden Feld, find nur komplette übereinstimmungen</dd>
         *  <dt>commadSW</dt>
         *  <dd>Findet alle Einträge die mit dem übergebenen Wert anfangen</dd>
         *  <dt>commandPM</dt>
         *  <dd>Findet alle Einträge auf die der übergebene RegEx passt(muss mit delimiter übergeben werden)<br />Beispiel:<br />
         *  /# Comment ID1$/ - findet alle Einträge mit dem Kommentar '# Comment ID1' am Ende
         *  </dd>
         * </dl>
         * Beispiel:<br />
         * <pre>
         * $crontab = new Crontab();
         * $crontab->find(array(
         *     'hour' => 12,
         *     'commandSW' => 'php '
         * ));
         * </pre>
         * Findet alle Cronjobs die zwischen 12 und 12:59 aufgerufen werden und des Befehl mit 'php ' startet
         *
         * @param array[optional] $spec
         * @return array
         */
        
    public function find(array $spec=array()) {
            
    $result = array();
            foreach(
    $this->rows AS $i => $row) {
                if((!isset(
    $spec['minute'])  || $spec['minute'] == $row[0])
                && (!isset(
    $spec['hour'])    || $spec['hour'] == $row[1])
                && (!isset(
    $spec['dom'])     || $spec['dom'] == $row[2])
                && (!isset(
    $spec['month'])   || $spec['month'] == $row[3])
                && (!isset(
    $spec['dow'])     || $spec['dow'] == $row[4])
                && (!isset(
    $spec['command']) || $spec['command'] == $row[5])
                && (!isset(
    $spec['commandSW']) || $spec['commandSW'] == substr($row[5], 0strlen($spec['commandSW'])))
                && (!isset(
    $spec['commandPM']) || preg_match($spec['commandPM'], $row[5]))
                ) { 
                    
    $result[$i] = $row;
                }
            }
            return 
    $result;
        }

        
    /**
         * Entfernt alle Cronjobs die mit den Suchparameters übereinstimmen<br />
         * gleiche Suchparameter wie Crontab::find() und zusätzlich 'row' damit kann gezielt eine Zeile gelöscht werden
         *
         * @param array $spec
         * @return int Anzahl der gelöschten Zeilen
         * @see Crontab::find()
         */
        
    public function remove(array $spec) {
            if(isset(
    $spec['row'])) {
                    unset(
    $this->rows[$spec['row']]);
                    return 
    true;
            }
            
    $rows $this->find($spec);
            foreach(
    $rows AS $i => $row) {
                unset(
    $this->rows[$i]);
            }
            return 
    count($rows);
        }

        
    /**
         * Benötigt eine Zeile der Crontab als String oder numerisches Array. <br />
         * Minute, Stunde, Tag im Monat, Monat, Tag der Woche, Befehl
         *
         * @param array|string $row
         * @return boolean
         */
        
    public function add($row) {
            if(
    is_string($row)) {
                
    $row $this->_parseRow($row);
                if(
    count($row) != 6) {
                    return 
    false;
                }
            } else if(
    is_array($row)) {
                if(
    count($row) != 6) {
                    return 
    false;
                }
                
    $command array_pop($row);
                
    $row array_map(array($this'_sanitize'), $row);
                
    $row[] = $command;
            } else {
                return 
    false;
            }
            
    $this->rows[] = $row;
            return 
    true;
        }

        
    /**
         * Speichert alle Cronjobs in die Crontab Datei des Users
         *
         * @return boolean 
         */
        
    public function save() {
            
    $file tempnam(sys_get_temp_dir(), 'PHP_CRONTAB');
            
    $handle fopen($file'w');
            foreach(
    $this->rows AS $row) {
                
    fwrite($handleimplode(' '$row).PHP_EOL);
            }
            
    fclose($handle);
            
    exec("crontab $file");
            
    unlink($file);
            
    $tmp $this->rows;
            
    $this->_parse();
            return (
    $tmp === $this->rows);
        }
    }

    ?>
    Und die Funktion:
    PHP-Code:
    $crontab = new Crontab();
    $sexy = array($dateTime['min'] , $dateTime['std'] , $dateTime['days'] , $dateTime['month'] , "*" "/var/www/virtual/tld-domain.de/htdocs/sh/stopserver.sh ".$_POST['port']);
        echo 
    $sexy[5];
        echo 
    "Count1:".count($sexy)."|";
        
    $crontab->add($sexy);
        
    $crontab->save();
      if(
    $crontab->add($sexy) == false)
      {
          echo 
    "FALSE-_-";
      }
      else if(
    $crontab->add($sexy) == true)
      {
          echo 
    "true1111";
      }
      
      
    $crontab = new Crontab();
          echo 
    "Wie viele Cronjobs?:".count($crontab->getAll()); 

    Was macht er bzw was gibt er aus?:

    Count1:6|true1111Wie viele Cronjobs?:0

    Also irgendwas mache ich falsch.


    Kann mir da einer weiterhelfen? Habe schon viel gegoogle und das ist bis jetzt das ergebniss.


  • #2
    Zitat von slipknoter6 Beitrag anzeigen
    Hallo
    Ich will mir eine Hosting website machen.
    Nur habe ich da noch ein problem. Und zwar soll ja wenn die Server bzw ein Server auslauft soll er automatisch gestoppt werden.

    So da habe ich mir gedacht das geht mit Cronjob bzw ich habs gelesen.
    Ich habe da schon bischen probiert aber leider geht das bis jetzt nicht.
    Ich habe Angst.

    Zu deinem Problem: Geht nicht ist keine Fehlerbeschreibung. Schalte Error-Reporting ein und auf volle Stufe, mache Debugausgaben und finde heraus, in welcher If-Verzweigung er landet und was genau passiert und vorallem welcher Codeabschnitt eben nicht das tut was er soll.
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      Und zwar soll ja wenn die Server bzw ein Server auslauft soll er automatisch gestoppt werden.
      was auch immer das ist, ich befürchte cron ist nicht schnell genug, um dein server in kritischen situationen zu stoppen.

      Kommentar


      • #4
        Error-Reporting habe ich schon auf E_ALL und dort kommen keine errors. Mit dem Debugausgaben soll ich die auch in die Cronjob.php machen? Habe ja schon prakrtisch die Funktion mit Echo gedebugt und geguckt wo es hin geht

        Sry fals es grade bischen dumm vorkommt aber grade echt verzweifelt


        @Moma

        Wenn der Server nur noch 2min Lauft soll er in 2Minuten automatisch ausgehen heißt heruntergefahren werden.

        Kommentar


        • #5
          Zitat von slipknoter6 Beitrag anzeigen
          @Moma
          Wenn der Server nur noch 2min Lauft soll er in 2Minuten automatisch ausgehen heißt heruntergefahren werden.
          wenn er nur noch 2 minuten läuft, ist er nach 2 min aus, eo ipso.

          btw. möglicherqweise suchste sowas ?

          http://linux.die.net/man/8/watchdog

          //OT: was ist an dem thema eigentlich forgeschritten?

          Kommentar


          • #6
            moma: Er meint damit, wenn der Vertrag mit dem Kunden ausläuft soll automatisch der Server der zu diesem Vertrag gehört heruntergefahren werden.
            Zitat von nikosch
            Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

            Kommentar


            • #7
              Cronjob per PHP erstellen

              Also hast du pro Server ein Kunde? Ich hoffe, Server ist hier gleichbedeutend mit Virtualisierung.
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar


              • #8
                Frage ist unverständlich und wenig fortschrittlich.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Nein Ich kann den Kunden beliebig viele Server geben. Und mit Server meine ich GameServer(CSS CS:GO) oder VoiceServer(TS)

                  Kommentar


                  • #10
                    Und warum nichts vorgefertigstes wie https://easy-wi.com/de/gameserver-webinterface/ ?

                    Kommentar


                    • #11
                      Weil ich gerne ein eigendes haben möchte. Wo ich weiß wie es alles Funktioniert und ich gerne diese Sprache lernen möchte

                      Kommentar


                      • #12
                        Zitat von slipknoter6 Beitrag anzeigen
                        Nein Ich kann den Kunden beliebig viele Server geben. Und mit Server meine ich GameServer(CSS CS:GO) oder VoiceServer(TS)
                        Das hindert dich immer noch nicht daran, die Umgebungen zu virtualisieren. Damit kannst du auch eine Lastverteilung erreichen, weil wohl kaum 1 TS-Server einen üblichen Dedicated Server (~3 GHz, 16 GB RAM) überlastet...
                        GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                        Kommentar


                        • #13
                          Weil ich gerne ein eigendes haben möchte. Wo ich weiß wie es alles Funktioniert und ich gerne diese Sprache lernen möchte
                          Ja, man sieht, dass Du unglaublich erfolgreich dabei bist.

                          https://www.tutorials.de/threads/cro...tellen.399004/

                          Der gleiche Code seit 2 1/2 Monaten und das einzig vernünftige daran hast Du Dir zusammengegooglet. Also erzähl doch nich so einen Mist.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar

                          Lädt...
                          X