Portál AbcLinuxu, 12. května 2025 01:42
Zdravím,
vytvořil jsem php skript, který pracuje jak má zavoláním z browseru i z shellu pod rootem (Debian). Nechce mi ale fungovat pod cronem.
Cron zcela určitě běží. Dokonce po zapnutí logování je vidět, že se skript spouští. Potíž je v tom, že nedělá co má. Využívá php funkce copy ke vzdálenému stažení a uložení souboru na serverový disk. Skript je přes cron spouštěn rootem, adresář kam se soubor má uložit má práva na 777 a vlastníka root. Přesto to vypadá, že uložení souboru vždy selže, pokud je skript volán z cronu.
Nějaké nápady co s tím?
Dobry den.
Cron muze mit jinak nastaveny PATH nez ho ma nastaveny nalogovany root.
Marek
V tom to bohužel taky nebude, protože ve skriptu mám include('config.php') a ten se evidentně načte ze správného adresáře i bez absolutní cesty, protože informace se zapisují do databáze z parametrů v naicludovaném souboru správně.
Když jsem to pak prvně nechal spustit přes cron tak jsem se divil, že se mi soubor nestáhl, ale do databáze se mi data zapsala. Tak jsem to ošetřil podmínkou if(copy(..)) která evidentně vrací false, protože do databáze se nic nezapíše a soubor nestáhne. Přes browser nebo shell to ale funguje.
Takže v cestách bych taky problém neviděl.
nn používám čistě copy(odkud,kam), přičemž odkud je vzdálená URL
Ale ví,m, že fopen funguje protože ten tam taky používám, ale na něco trochu jiného, nejprve si načítám potřebné informace pro následný download z json souboru (něco jako xml), právě přes fopen a to se do databáze zapisuje úspěšně, selže to až při snaze uložit na disk soubor, dokonce i přes fwrite, jak jsem si teď ověřil.
KAPITULACE a funkční leč nehezké řešení:
Protože přes webové rozhraní to jde, tak jsem si vytvořil druhý php skript, který spouštím cronem a v něm pouze otevírám a zavírám pro čtení přes fopen ten první, kde parametrem je celá URL adresa. Takže ten první skript spustí ten druhý přes webové rozhraní. Musel jsem ale bohužel zvýšit limity serveru pro zpracování skriptů přes webové rozhraní (execution time, paměť atp.)
No moje řešení nepotřebuje ani browser, prostě jednoduše fopen, fclose. Lynx by udělal v podstatě to samé. A myslím, že problém s limity by to nevyřešilo. Lynx by sice běžel přímo na tom serveru, ale opět by odkazoval absolutní URL, takže by apache opět bralo v potaz nastavení php pro externí webové rozhraní.
Až budu mít víc času se v tom hrabat, zkusím zapnout na moment logy a zjistit jestli to něco hlásí. Teď by mě ty logy, ale přidělaly moc práce a možná by to nahlásilo jen "copy failed" nebo "permision denied", což by mě zrovna moc nepomohlo. Stejně už nevím jaká práva bych kde mohl nastavit.
Zdá se mě to nebo si odpovídáš na vlastní příspěvěk? To nevypadá úplně normálně a proto nemá smysl se před tebou ospravedlňovat. Ke svému jednáním mám důvody. A rozhodně bych nechtěl plýtvat něčím časem, kromě toho tvého samozřejmě. Pokud tě totiž odpovědi na dotazy natolik obtěžují, nechápu, co tady vůbec pohledáváš. Nemůžeš přece očekávat, že každý se bude řídit postupem řešení, kterým by ses patrně řídil ty. Existují opodstatnitelné vyjímky. Prosím opusť toto vláknu a již se nevracej :) O tvou pomoc nestojím.
Vyřešeno
Po tolika hodinách jsem nakonec objevil chybu tam kde jsem ji hledal hned na začátku. Cesta v "copy" musí být serverová absolutní cesta. Jenže chybu to nevyhazovalo ani nelogovalo, prostě se to jen nezkopírovalo. Ačkoli jsem zkoušel téměř každou prkotinu na tohle jsem už nějak pozapomněl a to taky proto, že v "include" příkazu to vzalo klidně relativní adresu.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.