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:
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ż:
: 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ć
W skrypcie php mam zadeklarowane:
Jak wytnę
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?)