Pomoc - Szukaj - U¿ytkownicy - Kalendarz
Pe³na wersja: CRON - raz jeszcze (problem rozwi±zany)
Forum PHP.pl > Forum > Gotowe rozwi±zania
kula
Witam.

Spêdzi³em wiele godzin na przegl±daniu tego forum i nie uda³o mi sie znale¿æ skryptów, które by potrafi³y dopisywaæ obojêtnie jakie zadanie do crontab lub je z tamt±d usuwaæ.

Bym odpala³ te skrypty z php.

Takze prosze kogo¶ o po¶wiecenie kilka minut i napisanie
skryptu który by dopisywa³ i usuwa³ wcze¶niej dopisan± komende do/z crontabs.


Serdecznie dziêkuje.
anopak
Je¿eli masz prawa dostêpu do crontabs to w czym problem? fopen fget/fwrite i fclose... pozatym bezsensu edytowaæ g³ówny plik crontaba, lepiej utworzyæ sobie odpowiedni w cron.d(zale¿y od dystrybucji)....
kula
Napisa³em klase obs³uguj±c± Cron-a, mysle ze sie przyda potomnym ktorzy beda z tym walczyæ.
Testowane pod Slackware 10.1, przygotowane tak by dzia³a³o pod innymi dystrybucjami LINUX-a/

A zatem tak wygl±da:

  1. <?
  2.  
  3. define('BEGIN_CRON_LINE', '#BEGIN_CRON_LINE cron.php'); //okreslenie poczatku bloku
  4. define('END_CRON_LINE', '#END_CRON_LINE cron.php'); //okreslenie konca bloku
  5. define('CRONTAB_PATH', '/var/spool/cron/crontabs/'); //katalog z plikami crontab
  6.  
  7. class cron
  8. {
  9.     var $user = ''; //zalogowany uzytkownik UNIX
  10.     var $tab = ''; //sciezka do pliku crontab
  11.     var $reldir = ''; //katalog z plikiem cron.php
  12.     var $begin_cron_line = '';
  13.     var $end_cron_line = '';
  14.     
  15.     //Sprawdzanie czy proces Cron jest aktywny
  16.     function checkCromProcessRunning()
  17.     {
  18.         if(''.exec('ps ax | grep crond') == '')
  19.             return 0;
  20.         else
  21.             return 1;
  22.     }
  23.     
  24.     //konstruktor
  25.     function cron()
  26.     {
  27.         //ustalenie katalogu z plikiem cron.php
  28.         $this->reldir = substr(__FILE__, 0, strlen(__FILE__) - 8);
  29.         
  30.         //zachowanie unikalnych indentyfikatorow blokow dla aplikacji
  31.         //dzialajacych na tym samym serwerze by uniknac kolidowania zapisu zadan
  32.         $this->begin_cron_line = BEGIN_CRON_LINE.' ('.$this->reldir.')';
  33.         $this->end_cron_line = END_CRON_LINE.' ('.$this->reldir.')';
  34.  
  35.         //process crond
  36.         if($this->checkCromProcessRunning() == 0)
  37.         {
  38.             exec('crond start');
  39.             if($this->checkCromProcessRunning() == 0)
  40.             {
  41.                 echo "-Brak zainstalowanego pakietu 'cron'";
  42.                 exit;
  43.             }
  44.         }
  45.         
  46.         //zczynanie nazwy zalogowanego uzytkownika
  47.         $this->user = exec('whoami');
  48.         
  49.         //okreslenie sciezki to pliku z crontab dla uzytkownia apache lub 'root'
  50.         $this->tab = CRONTAB_PATH.$this->user;
  51.         exec('touch '.$this->tab); //proba stworzenia pliku
  52.         if(!($fp = @fopen($this->tab, "r+"))) //sprawdzenie dla uzytkownia apache
  53.         {
  54.             $this->tab = CRONTAB_PATH.'root';
  55.             if(!($fp = @fopen($this->tab, "r+"))) //sprawdzenie dla root
  56.             {
  57.                 echo '----- cron.php -----<br><br>';
  58.                 echo 'Brak uprawnien do nastepujacych plikow:<br><br>';
  59.                 echo CRONTAB_PATH.$this->user.'<br>';
  60.                 echo CRONTAB_PATH.'root<br><br>';
  61.                 echo 'By umozliwic ustawianie cyklicznosci ustaw lub popros administratora o<br>';
  62.                 echo 'ustawienie praw zapisu dla uzytkownika <b>'.$this->user.'</b> do jednego z tych plikow<br>';
  63.                 exit;
  64.             }
  65.             else 
  66.             {
  67.                    fclose($fp);
  68.             }
  69.         }
  70.         else
  71.         {
  72.            fclose($fp);
  73.         }
  74.     }
  75.     
  76.     //zwraca tablice zadan wczesniej wpisanych przez cron.php
  77.     //return: 
  78.     //struktura wyniku
  79.     //[0][0] (zakres 0-59) oznacza minuty. 
  80.     //[0][1] (zakres 0-23) oznacza godzine. 
  81.     //[0][2] (zakres 0-31) oznacza dzieñ miesiaca. 
  82.     //[0][3] (zakres 0-12) oznacza miesiac. (0 i 1 to styczen) 
  83.     //[0][4] (zakres 0-7) oznacza dzien tygodnia (0 i 7 to niedziela)
  84.     //[0][5] nazwa plik php
  85.     //
  86.     //[1][0] (zakres 0-59) oznacza minuty. 
  87.     //[1][1] ...
  88.     //...
  89.     function getTasks()
  90.     {
  91.         $result = array();
  92.         $content = file($this->tab);
  93.         $validblock = 0;
  94.         $pos = 0;
  95.         for($i=0; $i<count($content); $i++)
  96.         {
  97.             $line = trim($content[$i]);
  98.             
  99.             if($line == $this->begin_cron_line) //poczatek bloku
  100.             {
  101.                 $validblock = 1;
  102.                 continue;
  103.             }
  104.             if($line == $this->end_cron_line) //koniec bloku
  105.             {
  106.                 $validblock = 0;
  107.                 continue;
  108.             }
  109.             if($validblock == 1) //parsowanie bloku
  110.             {
  111.                 $task = explode(' ', $line, 6);
  112.                 $task[5] = str_replace("php ".$this->reldir, '', $task[5]);
  113.                 $task[5] = trim( str_replace('> /dev/null', '', $task[5]) );
  114.                 $result[$pos] = $task;
  115.                 $pos++;
  116.             }
  117.         }
  118.         
  119.         return $result;
  120.     }
  121.     
  122.     //wyswietla zawartosc pliku crontab
  123.     function cat()
  124.     {
  125.         $content = implode("\n", file($this->tab));
  126.         print_r($content);
  127.     }
  128.     
  129.     //Usuniecie wszystkich danych utworzonych przez klase cron
  130.     function deleteAllTasks()
  131.     {
  132.         //zczytanie z wykluczeniem bloku cron.php
  133.         $crontab = '';
  134.         $content = file($this->tab);
  135.         $validblock = 0;
  136.         $nothingtodelete = 1;
  137.         $lastline = '';
  138.         for($i=0; $i<count($content); $i++)
  139.         {
  140.             $line = trim($content[$i]);
  141.             if($line == $this->begin_cron_line) //poczatek bloku
  142.             {
  143.                 $validblock = 1;
  144.                 $nothingtodelete = 0;
  145.                 continue;
  146.             }
  147.             if($line == $this->end_cron_line) //koniec bloku
  148.             {
  149.                 $validblock = 0;
  150.                 $nothingtodelete = 0;
  151.                 continue;
  152.             }
  153.             if($validblock == 0 && (!($lastline == $line && $line == '')) ) //dodanie lini obcej
  154.                 $crontab .= $line."\n"; 
  155.                 
  156.             $lastline = $line;
  157.         }
  158.         
  159.         // zapisanie nowych danych jesli istnieje taka potrzeba
  160.         if($nothingtodelete == 0)
  161.         {
  162.             // otwarcie pliku do zapisu
  163.             $fp = fopen($this->tab, 'w');
  164.             // zapisanie danych
  165.             fputs($fp, $crontab);
  166.             // zamkniecie pliku
  167.             fclose($fp);
  168.         }
  169.     }
  170.     
  171.     //Dodanie zadania do listy cron-a
  172.     //$phpfile: plik [nazwa].php z relatywna sciezka od sciezki cron.php
  173.     function addTask($minutes, $hours, $daysofmonth, $months, $daysofweek, $phpfile)
  174.     {
  175.         //zapamietanie istniejacych zadan
  176.         $tasks = $this->getTasks();
  177.         //dodanie nowego
  178.         $tasks[count($tasks)] = array($minutes, $hours, $daysofmonth, $months, $daysofweek, $phpfile);
  179.         
  180.         //usuniecie starych
  181.         $this->deleteAllTasks();
  182.         
  183.         $block = "\n".$this->begin_cron_line."\n";
  184.         for($i=0; $i<count($tasks); $i++)
  185.         {
  186.             $minutes = $tasks[$i][0];
  187.             $hours = $tasks[$i][1];
  188.             $daysofmonth = $tasks[$i][2];
  189.             $months = $tasks[$i][3];
  190.             $daysofweek = $tasks[$i][4];
  191.             $phpfile = $tasks[$i][5];
  192.             
  193.             $block .= "$minutes $hours $daysofmonth $months $daysofweek ";
  194.             $block .= "php ".$this->reldir.$phpfile." > /dev/null \n";
  195.         }
  196.         $block .= $this->end_cron_line;
  197.         
  198.         // otwarcie pliku do dopisu
  199.         $fp = fopen($this->tab, 'a');
  200.         // zapisanie danych
  201.         fputs($fp, $block);
  202.         // zamkniêcie pliku
  203.         fclose($fp);
  204.         
  205.         //restartowanie cron-a, by dzialanie nowego zadania bylo natychmiastowe (jesli sa prawa dla uzytk. apache)
  206.         exec('killall crond');
  207.         exec('crond start');
  208.     }
  209.     
  210.     function deleteTask($phpfile)
  211.     {
  212.         //zczytanie z wykluczeniem zadan dotyczacych $phpfile
  213.         $crontab = '';
  214.         $content = file($this->tab);
  215.         $validblock = 0;
  216.         for($i=0; $i<count($content); $i++)
  217.         {
  218.             $line = trim($content[$i]);
  219.             if($line == $this->begin_cron_line) //poczatek bloku
  220.                 $validblock = 1;
  221.                 
  222.             if($line == $this->end_cron_line) //koniec bloku
  223.                 $validblock = 0;
  224.  
  225.             if($validblock == 1)
  226.             {
  227.                 $searchfor = "/$phpfile > /dev/null";
  228.                 if(!(strpos($line, $searchfor) === false))
  229.                     continue;
  230.             }
  231.             
  232.             $crontab .= $line."\n"; 
  233.         }
  234.         
  235.         // otwarcie pliku do zapisu
  236.         $fp = fopen($this->tab, 'w');
  237.         // zapisanie danych
  238.         fputs($fp, $crontab);
  239.         // zamkniecie pliku
  240.         fclose($fp);
  241.     }
  242. }
  243. ?>


Trzeba uwa¿aæ by w uruchamianym pliku linki do innych plikow byly absolutne np.
  1. <?php
  2. include(dirname(__FILE__).'../config.php');
  3. ?>



A oto kilka przykladów wykorzystania.

1. Wy¶wietlenie zapisanych zadañ
  1. <?php
  2. $c = new cron;
  3. $tasks = $c->getTasks();
  4. for($i=0; $i<count($tasks); $i++)
  5. {
  6.     $t = $tasks[$i];
  7.     print_r($t);
  8.     echo '<br>--------<br>';
  9. }
  10. ?>


2. Kasowanie wszystkich utworzonych
  1. <?php
  2. $c = new cron;
  3. $c->deleteAllTasks();
  4. ?>


3. Dodanie paru nowych zadañ
  1. <?php
  2. $c = new cron;
  3. $c->addTask('*', '*', '*', '*', '*', '../plugins/system/sync1.php');
  4. $c->addTask('1', '*', '*', '*', '*', '../plugins/system/sync2.php');
  5. $c->addTask('2', '*', '1-20/2', '*', '*', '../plugins/system/sync3.php');
  6. $c->addTask('3', '*', '*', '*', '*', '../plugins/system/sync4.php');
  7. $c->addTask('4', '*', '*', '1-2', '*', '../plugins/system/sync5.php');
  8. ?>


4. Kasowanie utworzonych zadan dotycz±cych danego pliku
  1. <?php
  2. $c = new cron;
  3. $c->deleteTask('../plugins/system/sync.php');
  4. ?>
Strza³ek
dodaj komentarze php doca i wrzuæ na forum Algorytmy, Klasy, Funkcje winksmiley.jpg
To jest wersja lo-fi g³ównej zawarto¶ci. Aby zobaczyæ pe³n± wersjê z wiêksz± zawarto¶ci±, obrazkami i formatowaniem proszê kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.