ugrás a tartalomhoz

cron, exec, többiek

Pepita · 2012. Már. 1. (Cs), 19.14
Előre bocsátom: fejlődési céllal érdeklődök, nincs (sajnos) konkrét probléma, időben is ráér.

Amin gondolkodom, keresgélek:
Sok írásban olvastam, hogy exec()-et és társait messziről kerülni, u.azt a dolgot inkább cron-nal, ezeket a fv.-et inkább letiltani php.ini-ben, stb. DE:

-

Mi van, ha nincs cron? És mégis kell vmi hasonló. Gondolnám én bután(?): amikor jön a Júzer, megkapja az oldalát, közben exec a cron helyett, abban a progiban meg benne az ellenőrzés, hogy kell-e már futni, v. exit. Ilyenkor ugye, nem lassítottuk a Júzer kiszolgálását a karbantartási (pl. DB-mentés) műveletek miatt. (Erre a kérdésre nem kérek ilyen választ: "másik tárhely kell".)
- Mi van, ha olyan (hosszú futásidejű) programrészt kell futtatni, ami "eseményvezérelt", tehát bizonyos felhasználói beavatkozás következménye, és nem ad vissza közvetlen kimenetet (pl. csak cache-be dolgozik, de rögtön)? Ilyen esetben én favágásnak érezném a pl. percenkénti cron-t ("fájl-kommunikációval"), ha a kiváltó esemény csak kb. hetente van, de nem tudni pontosan. Viszont a proginak meg hamar futni kell, mert mittomén. Gondolom, szolgáltatók azt se szeretik, ha percenként ketyeg egy-két-... cron, még ha csak néhány feltétel erejéig is.

Lehet, ez így zavaros, a ()-es pl-k sem túl életszerűek, de szeretném tudni, hogy mire valók exec() és társai, ha mindenki cron-t mond helyette?

Illetve azt is olvastam (talán Janoszen tollából), hogy biztonságtalan is így futtatni progit. Miért, milyen veszélyek vannak? Hogyan lehet (lehet-e) biztonságosan?

Aki ráér, kérném szíves véleményét!
 
1

MySQL

Hidvégi Gábor · 2012. Már. 1. (Cs), 19.26
MySQL 5.1-től van lehetőség időzített lekérdezések indítására, sokszor elég lehet ennyi is.
2

Köszi,

Pepita · 2012. Már. 1. (Cs), 20.56
ennek is utána fogok menni, de elsősorban PHP oldalról érdekel, mentési, fájkezelési karbantartás, ill. statisztikai feladatokra, ...
3

Kompromisszum

Schmidi · 2012. Már. 2. (P), 10.39
Mi van, ha nincs cron? És mégis kell vmi hasonló. Gondolnám én bután(?): amikor jön a Júzer, megkapja az oldalát, közben exec a cron helyett, abban a progiban meg benne az ellenőrzés, hogy kell-e már futni, v. exit. Ilyenkor ugye, nem lassítottuk a Júzer kiszolgálását a karbantartási (pl. DB-mentés) műveletek miatt. (Erre a kérdésre nem kérek ilyen választ: "másik tárhely kell".)

Ilyenkor kompromisszumos megoldás van, ami nem szép, de alkalmanként hasznos.

Nálam volt ilyen, napi mentést kellett megoldani cron nélkül.

1. Készült egy .php script, ami megvalósítja a mentést, emlékeim szerint mysqldump-ot exec-el.
2. Az oldalba (ami amúgy egy fórum motor) bekerült egy feltétel, hogy ha a lapletöltés időpontja nagyobb mint 23:00, akkor beinclude-olja a dumpoló scriptet.
3. Ha dump script elindul, megnézi hogy aznap készült-e már backup.
4. Ha még nem, akkor csinál egyet, aztán eldobja a három napnál régebbieket, hogy ne foglalja a helyet. Ha aznap már volt backup, akkor nem csinál semmit.

A buktatók:
- Feltételezi, hogy az oldalnak van olyan látogatottsága, hogy minden nap 23:00 és 24:00 között van legalább egy látogatója.
- Amíg a dump fut (2-3 perc), addig ott áll a végrehajtás, a user meg homokórát lát
- A mysqldump lockolja a DB-t, így a backup alatt minden arra tévedő user homokórát lát.

A megoldás messze van az ideálistól, de mivel nem business critical szolgáltatásról van szó, a célnak pont megfelelt.

Ha érdekel részletesen, később tudok mutatni kódot is hozzá.
4

A buktatók:… többsége

kuka · 2012. Már. 2. (P), 11.24
A buktatók:
… többsége elkerülhető webes cron szolgáltatás igénybevételével. Az Online Cron Services felsorol párat, beleértve ingyeneseket is.
6

Köszi!

Pepita · 2012. Már. 2. (P), 20.13
Ez annyiban különbözik a "másik tárhely"-től, hogy u.az a dolog nem igényel többletráfordítást anyagilag.

Lehet nem eléggé jól fogalmaztam meg a kérdést, sőt, valószínű. Az is lehet, hogy csak én vagyok ilyen "desktop-os" szemléletű (múltú), de talán a kérdésem lényege az, hogy felhasználó által kiváltott esemény hatására akarok elindítani a háttérben (=nem homokórázó) futó progit, aminek nincs közvetlen HTML kimenete.

Az is lehet, hogy a weben ilyen "nincs", csak én vagyok ilyen "eseményvezérelt"... Legalábbis erre következtetek abból, hogy válaszaitok is azt tükrözi, amit/amiket máshol is olvastam.

Szóval: hagyjam a fenébe? Vagy vmilyen cron, vagy lófütty?
7

felhasználó által kiváltott

kuka · 2012. Már. 2. (P), 20.44
felhasználó által kiváltott esemény hatására akarok elindítani a háttérben (=nem homokórázó) futó progit, aminek nincs közvetlen HTML kimenete.
És az miért nem jó ha webes cron szolgáltatás által kiváltott esemény hatására indítod, aztán a webes cron szolgáltatás nézze a homokórát míg megunja?

De végül is ha az exec()-el indított parancsot háttérbe küldöd és a kimenetét átirányítod, akkor a PHP szkript nem várja meg és nincs homokóra:

exec('/ments/meg/szerelem --vagy belehalok  >/dev/null 2>/dev/null &');
10

Lásd lentebb

janoszen · 2012. Már. 2. (P), 21.23
Lásd a lentebbi magyarázatot, bármilyen épeszű rendszergazda ha meglát valami levegőben lógó processzt, kilövi a fenébe. Nyilván azért nem ad cron szolgáltatást a szolgáltató, mert nem szeretné, ha hosszan futó processzek legyenek. És/Vagy nincs elég szakértelme bekonfolni normálisan a szerverét, de az ilyen szolgáltatókat sürgősen ott kell hagyni.

Ezen felül a másik probléma, amire Kayapo kolléga felhívta a figyelmemet, hogy SELinux alatt van olyan opció, ami az ilyen renegát processzeket kilövi egy idő után.
5

Köszönöm a választ,

Pepita · 2012. Már. 2. (P), 20.03
viszont nem értem egészen...
...emlékeim szerint mysqldump-ot exec-el.
Ez azt jelenti: exec() függvénnyel? Mert ha igen, akkor ez:
...akkor beinclude-olja a dumpoló scriptet.
miért kéne? Ha exec(), akkor nem homokórázik, csak a DB miatt, nem? Viszont ha include(), akkor a "lap végén" fut a szkripted, tehát nincs exec().
9

Nem.

janoszen · 2012. Már. 2. (P), 21.21
If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.


A mindenféle execről a POSIX (Linux, Unix, stb) értelmében:

POSIX platform alatt az exec függvény forkol egyet, majd a gyerek szálba betölti a végrehajtani kívánt programot. A szülő szálból megkapod a gyerek input/output/error descriptorát, amivel tudsz vele kommunikálni. Ha a szülő processz terminál (pl. az Apache úgy dönt, hogy azt a szálat újra kell indítani), akkor az általad indított folyamat az inithez kerül (adoptálja). Ez önmagában nem probléma, de ha egy rendszergazda lát egy levegőben lógó processzt, biztos lehetsz benne, hogy a következő mozdulata az lesz, hogy kilövi a fenébe, mert nem tudja kideríteni, honnan szalajtották. Ez kb így fog kinézni:

janoszen  3529  0.6  0.4 375188 19368 ?        Sl   20:12   0:02 gnome-terminal
janoszen  3533  0.0  0.0  14656   852 ?        S    20:12   0:00  \_ gnome-pty-helper
janoszen  3534  0.0  0.1  30564  5592 pts/0    Ss+  20:12   0:00  \_ bash
janoszen  3632  0.1  0.1  30564  5568 pts/1    Ss   20:15   0:00  \_ bash
janoszen  3770  0.0  0.0  22344  1248 pts/1    R+   20:17   0:00      \_ ps auwfxx
janoszen  3768  0.0  0.0  96332  3568 pts/0    S    20:17   0:00 php forktest.php
8

Van helye

janoszen · 2012. Már. 2. (P), 21.07
Az execnek megvannak a maga felhasználásai, de az esetek 99,5%-ában olyasmire használják, amire nem való. Ha egy mezei egyszerű weboldalhoz, webshophoz execre van szükséged, akkor valamit nagyon, nagyon, nagyon rosszul csinálsz. Az nem érv, hogy nem támogat cronjobokat a tárhelyszolgáltató, az éves 5-6-7000 Ft-os tárhelyek korában az ilyen szolgáltatót ott kell hagyni a fenébe és keresni kell egy jobban. Nem akarok példákat mondani, de van, ahol felárért még SSH hozzáférést is kapsz a tárhelyedhez.

Az exec-kel az a legfőbb probléma, hogy az, aki használja, legtöbbször nem érdi a Linuxos processz modellt, jogosultsági rendszert és ezért majd csodálkozni fog, ha instabil vagy biztonsági hibás lesz az alkalmazás. Tipikusan ilyenek azok is, akik azzal magyarázzák az exec használatát, hogy valamiféle admin panelt írnak.

Röviden és tömören a lényeg: az exec nem való frontendet kiszolgáló alkalmazások alá. Kizárólag külön jogosultsági szinten futó, API-val megszólítható rendszerekre. Egész egyszerűen azért, mert több szinten kell védekezni és ha egyetlen védelmed van (az escapelés a parancssorban), akkor egy abban felfedezett hiba az EGÉSZ alkalmazás vagy szerver biztonságát veszélyeztetheti. Nem az a kérdés, hogy talál-e valaki code execet, hanem hogy mikor. Láttam már jó pár ilyet és mindig okosnak hitte magát a programozó.
11

Köszönöm szépen

Pepita · 2012. Már. 2. (P), 21.54
válaszaidat, asszem jó sok időre le is beszéltél... Mert a Linux mélységeibe beletanulni ha volna is most időm/energiám rá, akkor is sok kéne. Utolsó "bekezdésedből" kezdtem el kapisgálni a biztonsági dolog lényegét (pedig cikkedet is olvastam), számomra az a lényeg, hogy ehhez sokat-sokat kell tanuljak, addig meg nem szabad "próbálkozni".

(Egyébként egyik ami a gondolkodásra idított: egy neked is "elég ismerős" szolgáltatónál 3 tárhelycsomag közül csak a legdrágább ad cron-t. De nem ez volt a lényeg, mert ahova cron kell, oda az a csomag kell és kész. Évi 3-5 e Ft különbségért nem szabad gányolással "pótolni", ez eredetileg is véleményem volt.)

Mégegyszer köszönöm.
12

Értéknövelt

janoszen · 2012. Már. 2. (P), 23.06
Nem véletlenül kerül többe. Amikor építettük, arra számoltunk, hogy aki ilyen funkciókat használ, az valszeg több erőforrást is eszik és ez be is igazolódott. Ugyan a FastCGI-s PHP alól is tudsz dolgokat indítani, de nem volt szempont, hogy szivassuk az ügyeskedőket. Egyébként azon is elgondolkoztam, hogy érdemes lenne erről a tárhely-témáról egy hosszabb cikket írni.
13

Hajrá cikk!

Pepita · 2012. Már. 2. (P), 23.36
Én megköszönném azt a cikket! Főként, ha lenne benne PHP-Apache beállításokról ("trendekről") is szó.

Azt a FastCGI-s cuccosodat (ha egyre gondolunk) nemigazán értem (még), nem is akarnék "ügyeskedni"; az ottani középső csomagból - számomra és egyelőre - csak a cron hiányzik. Később valószínű, hogy kihasználnám a további "extra" szolgáltatásokat is, de az már másik honlap, megrendelő, stb. lenne. Nem is olyan rég csináltam egy honlapot, ahol még DB sincs, de összesen két "főnök" számára kiküldött heti email van (naplórészlet, stb.). Tehát nagyon egyszerű honlap esetében is könnyen "befigyel" a kihasználatlan tárhely/szolgáltatás. Mondjuk ez sem egetverő, mert az itt-meg-nem-nevezett szolgáltatónak szerintem elég jó árai vannak.
(A DB nélküli honlap egy drágább helyen van, és ott csak a tárhelyméret több - feleslegesen -, viszont sok más szempontból rosszabb.)
14

Cikk

janoszen · 2012. Már. 2. (P), 23.44
Majd nekiülök megírni. Nem egyszerű téma, majdnem 5 év kutatás-fejlesztését kell összefoglalni, ugyanis ennyi időt foglalkoztam a témával.