Strona 1 z 2

Cron - powielanie nieuzasadnione długich zadań

: 07 stycznia 2009, 10:40
autor: georigo
Witam
Mam taki oto problem. Mam pliki PHP z zapytaniami SQL do oracla. Są to zapytania do baz całej Polski (serwery Kraków, Warszawa, Katowice,... w sumie 21 baz). Wykonują się one o 8, 12, 16 z wykorzystaniem Crona. Dane są zrzucane do pliku o nazwie:
  • Nazwa_data_godz.csv
I w momencie kiedy zapytanie zrzucające dane trwa dłużej niż 1 godzinę proces zaczyna się powielać i tworzy mi nowy plik z nową godziną. Nie wiem co z tym zrobić. Dlaczego Cron powiela proces. Pomóżcie proszę

Pozdrawiam
georgio

: 07 stycznia 2009, 10:43
autor: grzesiek
Może się uruchamia ponownie, np. co godzinę. Pokaż:

Kod: Zaznacz cały

crontab -l

: 07 stycznia 2009, 11:13
autor: mariaczi
Tak wg mnie, w skrypcie wprowadz zmienna (pusty plik) ktora bedzie sprawdzana na poczatku i jesli istnieje dalsza czesc nie wykona sie. Po zakonczeniu operacji usun ten pusty plik.

: 07 stycznia 2009, 16:57
autor: gibon
mariaczi to się nazywa lock :)

: 08 stycznia 2009, 08:26
autor: georigo
@grzesiek, napisałem wyżej, że uruchamia się o 8, 12, 16, a nie co godzinę:

Kod: Zaznacz cały

01 8,12,16,20,23	* * *	root	wget -q -O /dev/null [url]http://192.168.1.10/zapytania_sql/cron/SAMURAJ/samuraj_LLU.php[/url]
01 8,12,16,20,23	* * *	root	wget -q -O /dev/null [url]http://192.168.1.10/zapytania_sql/cron/SAMURAJ/samuraj_WLR_1.php[/url]
01 8,12,16,20,23	* * *	root	wget -q -O /dev/null [url]http://192.168.1.10/zapytania_sql/cron/SAMURAJ/samuraj_WLR_2.php[/url]
@mariaczi, możesz jaśniej bo nie zrozumiałem. Mam napisaną klasę do zrzucania danych do *.csv. Z tego co napisałeś zrozumiałem, że jeśli plik jest pusty to się przywiesi - czy tak?

Wrzucam klasę:

Kod: Zaznacz cały

<?
if (!defined("PHP_generator_CSV")){
    define("PHP_generator_CSV",1);

class generatorCSV{
	var $default_dir="./"; 	//docelowy katalog zapisu pliku
	var $start=0;

function csvStart($filename) { 
	$this->plik = fopen($this->default_dir.$filename.'.csv', 'a+');
	flock($this->plik, 2); 				
return; 
}

function csvDane($Value) {      
    fputcsv($this->plik,$Value,$delimiter=';');
return;
     }

function csvEnd() {
    flock($this->plik, 3); // odblokowuję
    fclose($this->plik); 	
return;
}

function oci8($usr,$hsl,$baza,$str_SQL_OCI8) {
$db_conn = oci_connect($usr,$hsl,"
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =".$baza."-o.ksp.tepenet)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = ".$baza.")
    )
  )","EE8MSWIN1250");	
  
	$db_stmt = oci_parse( $db_conn, $str_SQL_OCI8);
	OCIExecute( $db_stmt, OCI_DEFAULT );
	$ncols = OCINumCols($db_stmt);
if($ncols>0){
$this->start++;
if($this->start==1){
 $nazwyKolumn= array();
  for($q=1;$q<=$ncols;$q++){
    array_push($nazwyKolumn,oci_field_name($db_stmt,$q));
}
 $this->csvDane($nazwyKolumn);
}
while($db_wynik = oci_fetch_array ($db_stmt, OCI_RETURN_NULLS+OCI_ASSOC)){
 $this->csvDane($db_wynik);
}
$db_wynik=array();
//oci_free_statement($db_stmt);
oci_close($db_stmt);
return;
}
}
}
}
?>

: 08 stycznia 2009, 09:31
autor: mariaczi
Tak jak to określił po fachowemu gibon - robisz lock'a.

W klasie dołóż funkcję, która na samym początku sprawdzi czy np w $temp lub w katalogu gdzie leży skrypt nie ma pliku o okreslonej nazwie np. nazwa-twojego-skryptu_lock. Jesli taki plik istnieje to proces (skrypt) nie wykonuje sie dalej. Oznacza to, ze juz proces jest w trakcie zrzuciania danych. Jesli lock'a nie ma (pliku) to jedziesz dalej z tym co ma sie wykonac - zapytania i to co potrzebujesz. Po zakonczeniu operacji zrzucania danych sukcesem usuwasz (funkcja) lock'a (plik).
Moze przyda Ci sie wykorzystanie systemowej funkcji "pidof" :)

: 08 stycznia 2009, 09:38
autor: georigo
Dziękuję.
A mam jeszcze jedno pytanko. Czemu nie mogę w crontabie dodać samego odnośnika do pliku php tylko muszę wywoływać

Kod: Zaznacz cały

 wget -a
W skrypcie php mam zadeklarowane:

Kod: Zaznacz cały

#! /usr/bin/php5 -e
Jak wytnę

Kod: Zaznacz cały

wget -a
to mi się nie uruchamia skrypt.

: 08 stycznia 2009, 09:44
autor: mariaczi
Jesli IP, które podajesz w cronie to IP maszyny na ktorej skrypt lezy i jest uruchamiany to nie łatwiej "php /siezka/do/skryptu/nazwa_skryptu.php"?

: 08 stycznia 2009, 09:53
autor: georigo
Łatwiej, ale nie chciał mi działać. Rozumiem, że to ma wyglądać tak:

Kod: Zaznacz cały

01 8,12,16,20,23    * * *    php    /zapytania_sql/cron/SAMURAJ/samuraj_WLR_2.php
Awracając jeszcze do pierwszego pytania to ja przez skrypt mam utworzyć plik _lock i sprawdzać przy kolejnym uruchomieniu przez crona, czy taki istnieje. Jeśli tak to zabić proces?

: 08 stycznia 2009, 10:00
autor: mariaczi
Musisz zapewne podac pelna sciezka do "php" czyli /bin/php czy /bin/php5 (sciezki pisze z pamieci).
Na poczatku skryptu sprawdzasz czy plik _lock istnieje, jesli go nie ma Twoj skrypt tworzy taki plik i skrypt wykonuje sie dalej. Nim zacznie wykonywac sie dalej dobrze abys na zmiennej ustalil nazwe pliku csv do ktorego bedziesz zrzucal dane - bedzie ona wtedy stala przez caly czas dzialania skryptu (moze nawet tylko to wystarczy, zamiast lockow).

Cron nie musi nic sprawdzac, niech skrypt to robi.

PS. W trakcie wykonywania skryptu masz w kilku miejsach zrzut danych do pliku po zmiennej pochodzacej od czasu? (Czas pobierany jest przed samym zrzutem?)