Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][CLI] Zabezpieczenie przed uruchomieniem parokrotnie skryptu
Octobus
post
Post #1





Grupa: Zarejestrowani
Postów: 259
Pomógł: 1
Dołączył: 3.07.2011

Ostrzeżenie: (0%)
-----


Witam,

mam skrypt php ktory musi na okraglo wykonywac petle i obrabiac dane (glownie laczac sie z innymi serwerami: api, scrapowanie danych, zewnetrzne bazy danych, etc). Uruchomiony jest w cronie co minute, jak obrobi pewna ilosc danych zapisuje status do bazy i sie wylacza - i tak w kolko. Problem w tym ze czasem te skrypty wykonuja sie w pare sekund a czasem w pare godzin wiec musze zapobiegac przed tym zeby cronjob nie uruchomil kolejnych instancji jezeli jedna juz chodzi. Skrypt jest uruchamiany w cronjob i wykonywany z poziomu ssh, przy kazdym wykonaniu sprawdzam czy tego skryptu nie ma juz na liscie procesow:

  1. $ilosc_uruchomien = 0;
  2. $procesy = explode(PHP_EOL, shell_exec('ps -C php -f'));
  3. $needle = $_SERVER['SCRIPT_FILENAME'];
  4. foreach($procesy as $proces){
  5. if (strpos($proces, 'php '.$needle)!==false){
  6. ++$ilosc_uruchomien;
  7. }
  8. }
  9. if($ilosc_uruchomien > 1) die();


problem z tym rozwiazaniem jest taki ze czasem serwer nie zwraca takiej odpowiedzi jaka powinien (w shel_exec) np. zwraca informacje ze nie mozna bylo wykonac komendy z jakiegos powodu lub jakas inna wartosc i rozwiazanie to jest nie idealne a ja widze po procesach ze skrypt jest uruchamiany czasem nawet 5 razy na serwerze.
Widzialem w projektach open source ze rozwiazuja to za pomoca lock_file, blokuja plik na poczatku wykonywania skryptu a zwalniaja na koncu. Skrypt na pewno sie nie powieli ale problem w tym ze takich skryptow mam sporo na roznych serwerach i czesto zwracaja bledy (np. przez przeciazony serwer do ktorego sie lacze, pad bazy danych, etc) ciezko jest przewidzec wszystkie ewentualnosci i ciagle musialbym je odblokowywac recznie jezeli skrypt by nie doszedl do konca.

Moze zetkneliscie sie z takim problemem albo wiecie jak to lepiej rozwiazac ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Ja to rozwiazywalem przez tworzenie dodatkowego pliku. Skrypt sie odpalal, tworzyl plik, po skonczeniu kasowal plik. Gdy startowal skrypt znowu to patrzyl czy jest plik i jak byl to nie robil nic wiecej. oczywiscie zachodzily sytuacje jak napisales, ze skrypt mogl sie wywalic w srodku bo cos tam i nie skasowac pliku. Na te okolicznosc dodalem poprostu waznosc pliku. Jak byl stworzony ostatni raz za dlugo temu to uwazalem ze skrypt moze sie odpalic bo plik jest juz niewazny. Jakos dzialalo i to calkiem niezle.
Jesli zas uwazasz, ze twoj skrypt moze pracowac nawet kilka godzin, to aktualizuj ten tworzony plik rowniez w czasie pracy skryptu by bylo wiadomo ze skrypt ciagle chodzi.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 16:00