Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][CLI] Zabezpieczenie przed uruchomieniem parokrotnie skryptu
Octobus
post 6.09.2018, 09:48:59
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
nospor
post 6.09.2018, 09:53:59
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sabat24
post 6.09.2018, 11:26:37
Post #3





Grupa: Zarejestrowani
Postów: 175
Pomógł: 26
Dołączył: 13.09.2007
Skąd: Gdańsk

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


U mnie wygląda to tak, że do tego pliku lock zapisuję ID procesu. Dzięku temu nawet jeśli plik istnieje, pobieram ID procesu, sprawdzam, czy taki proces już występuje. Jeśli nie występuje, to znaczy, że serwer zabił go i skrypt nie skończył się wykonywać normalnie. Wtedy zazwyczaj odpalam ponownie ten proces i aktualizauję ID. Jeśli proces ciągle istnieje to patrzę na datę modyfikacji pliku i albo zabijam sam taki proces, jeśli uznam, że czas jest dziwnie długi, czekam na zabicie i odpalam ponownie właściwy skrypt albo zostawiam go i nie odpalam kolejnego.
Możesz też napisać własnego, prostego demona w PHP, który będzie kontrolował wszystkie procesy na danym serwerze zamiast crona.
Go to the top of the page
+Quote Post
batman
post 6.09.2018, 13:18:39
Post #4





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Jeśli musisz korzystać z crona, lock file jest tutaj najlepszym wyjściem. Jeśli jednak cron nie jest „must have”, zastanów się nad wykorzystaniem kolejek lub mechanizmu pub/sub.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 22:24