ugrás a tartalomhoz

PHP execelés linux alatt.

ZoZZo · 2008. Szep. 24. (Sze), 16.46
Sziasztok!

Egy olyan programot szeretnék használni, ami egy adott (*.sh) szkriptet futtat le. Készítettem egy rádió szerver készítő PHP programot SHOUcast alatt és a szerver indításával lennének néhány gondjaim. Az (*.sh) szkript maga a rádió szervert hívja meg, hogy elindítsa azt. Ezt a műveletet remekül elvégzi és elkezd futni a szerver is remekül. Nos az lenne a problémám, hogy amikor elindítom a szervert a következő php szkripttel, akkor egyszerűen a böngésző végtelen töltésbe kezd. De közbe fut a szerver is. Ha leállítom a töltést, akkor is fut tökéletesen és Rendszerfigyelőn is látható a program futása.

A lefuttató szkript a következő :

-------------------------------------------------------
exec('/bin/sh /var/www/sc_serv.sh');
-------------------------------------------------------
sc_serv.sh tartalma ...

/var/www/sc_serv
-------------------------------------------------------

Ez csak egy kis részlet, hogy hogyan indítja el a szervert a program.

Több dokumentációt olvastam [php.net]-en és egyéb más Google által talált oldalakon, de egyikük közül sem találtam meg azt amit kerestem. Nos lényegében ezért fordultam én a Weblaborhoz.

Összességében nekem egy tanács, vagy ötlet kéne, hogy hogyan indítsam el a szervert úgy, hogy ne kezdjen végtelen töltésbe. Pl .: 1-szer lefut és akkor megáll a töltés. Az egyéb más parancsok mint pl .: whoami működnek folyamatos töltés nélkül. Véleményem szerint a programot próbálja ott monitorizálni és ezért nem akarja megállítani a töltést. Ezt esetleg valahogy kilehet a monitorizálást kapcsolni? Vagy van erre más indítási módszer ami biztonságosabb, vagy jobban működik? Mert szerintem ha nagyobb dolgokba kezdenék ezzel a módszerrel, akkor magára omlana ez az egész.

Előre is köszönöm a tanácsokat, ötleteket, válaszokat!

Üdvözlettel, Bence.
 
1

Futtatás a háttérben

kris7topher · 2008. Szep. 24. (Sze), 17.06
A baj az, hogy a szerver elindul, és a terminálban fut (ha kézzel elindítod, nem kapsz újra $-t, hanem csak villog a kurzor). El kell érni, hogy a háttérben fusson. Javaslom valamilyen módon átírni az indító szkriptet. Tegyük fel, hogy a szervert a "/etc/init.d/shoutcast" indítja el. Elvileg ha a "/etc/init.d/shoutcast &"-et futtatod (persze idézőjelek nélkül) akkor az a háttérben kezd el futni (egy subshellben, elvileg, az eredetiben pedig visszakapod a $-t). Ez nem vagyok benne biztos, hogy működik, mert ha a PHP kilövi a bash-t, akkor a subshell is leállhat (bár még sohasem próbáltam...) A másig lehetőség valamiféle terminál multiplexert használni. A GNU Screen erre egész jó. Először telepíteni kell a Screen-t (nem írtad milyen Linux, de Ubuntu alatt például az "apt-get install screen -y" paranccsal). Ezután a "screen -d /etc/init.d/shoutcast" például nyit egy új terminált, elindítja a szervert, és leválasztja a terminált. A "screen -r" ekkor egyébként újra fölcsatolja a terminált, bár erre elvileg (mivel a felhasználó bemenetet nem kellene beírjon) nincs szükség. A szervert leállító paranccsal elvileg nem lehet gond (annak pont az a célja, hogy kilépjen, tehát nem marad futva).
2

Kilövés

ZoZZo · 2008. Szep. 24. (Sze), 17.45
Szia!

Részben értem, hogy mi lenne a cél. Ha leválasztja a terminált, akkor nyert ügy mert fut a dolog. Igen elnézést elfelejtettem írni milyen linuxt használok, de pont Ubuntut, tehát sikerült eltalálnod :). Tehát a a screen -d /var/www/sc_serv -et használom ami maga a szervert indítja el, akkor elméletben nyit egy új terminált és futtatja ott?

Kipróbálom és jelzek majd, ha jutottam-e valamire. De még erre kíváncsi vagyok, hogy ezt hogy lehet leállítani. Úgy tudom pkill, vagy valami ilyesmi.

Üdv, Bence.
3

Telepítettem

ZoZZo · 2008. Szep. 24. (Sze), 17.53
Nos a programot amit mondtál (apt-get install screen) telepítettem és beállítottam. Ezt követően készítettem egy szkript fájlt, ami elindítja a szervert.

---
nohup /var/www/sc_serv
---

Ez maga a konzol része, ami futtatja a szervert. A következő képp rá execeltem a indító szkriptre.

---
exec('screen -d /etc/init.d/sc_serv.sh');
---

Ekkor az oldal lefut 0.000060 mp alatt és eredményileg nem adott vissza semmit és a szervert sem indította el. A szerver sem indul el sajnos. Lehet, hogy én rontottam el valamit, ha igen légyszíves kijavítanátok engem?

Előrre is köszönöm!

Üdv, Bence.
4

Megtaláltam a bibit.

ZoZZo · 2008. Szep. 24. (Sze), 17.55
Kiírtam echo-val mit ad vissza és a következő hibát írta :

Must run suid root for multiuser support.

Ezt hogyan tudnám beállítani, hogy jól működjön? Gondolom valami féle jogot kéne rá adnom, csak épp azt nem tudom mit. Segítenétek légyszíves?

Köszönöm!

Üdv,
Bence.
5

root vagy nem root?

kris7topher · 2008. Szep. 24. (Sze), 18.35
Az egyetlen amire gondolni tudok, hogy nem root-ként fut le a shellscript, bár ha nem rootként elindult a szerver, akkor nem kéne ezzel gond legyen, a screen (elvileg) nem kéne root jogokat használjon. Ha nem, akkor a sudoer-s hez fel kéne venni, hogy a screen -d /var/www/sc_serv parancsot jelszó nélkül le lehessen futtatni (mondjuk ez óriási biztonsági kockázatot ad, de más ötletem nincs...) és a parancsot a scriptben sudo -u root "screen -d /etc/init.d/sc_serv.sh" -re cserélni. Azt kipróbáltad, hogy simán a /etc/init.d/sc_serv.sh végére egy &-t teszel, screen -d nélkül? Hátha bejön, bár valószínűleg nem.
A terminál leválasztás nem azt jeleni, hogy egy új ablak nyílit, hanem hogy a munkamenet a háttérben fog futni, és bármikor "fel lehet venni". A terminál multiplexer tehát kicsit olyan, mint egy erősen fölturbózott asztalkezelő, csak éppen terminálhoz, nem X grafikus felülethez.
6

Hiba

ZoZZo · 2008. Szep. 24. (Sze), 18.53
A & megoldással már számtalanszor próbáltam de sajnos ugyan úgy futtatja. A terminálos dolgot értem, hogy nem új ablakba nyitja, hanem új sessionba amiről megpróbáljuk jelen esetbe leválasztani, hogy ne legyen folyamatos a töltés.

Itt a &-vel ezt csinálja :

http://84.3.231.1/

Példa programon megtudod nézni most. Amíg fut a gépem de most sokáig fog futni kb késő estig.

De itt ugyanaz a baj, hogy egyszerűen tölt-tölt-tölt és tölt :S

Ha ez működne, hogy egyszerűen lefut símán és elindítja a szervert úgy örülnék, hogy kimennék a hidegbe és körbe futnám jó párszor a házat :D

Remélem van valami megoldás én már minden lehetséges dolgot kipróbáltam.

De mivan akkor ha olyan scriptet írok, ami elindítja a progit és nyit egy új sessiont és abba fut a szerver és a script ami elinditotta bezárul tehát leáll és nem töltene az oldal sem. Szerintem.. Már egy ideje kitaláltam ezt, de nem tudom, hogyan kéne megvalósítani..

Van ötleted?

Üdv, Bence.
7

Hibás koncepció

janoszen · 2008. Szep. 24. (Sze), 22.47
Mostanában sok itt az olyan ember, aki PHP alól szeretne mindenféle szervereket elindítani. Alapvetően hibás a koncepció. Kollektíven ismerkedjetek meg a Linux process modellel, különben meglepődtök, ha egész váratlanul és mágikus módon a fejetekre dől az egész kóceráj.

Magyarul szólva: Ne indíts PHP-ból szervert!

Tegyél le a lemezre egy üres fájlt amit egy cronjob beolvas vagy akármi, de ne PHP-ból indítsd!
8

Egyetértek

deejayy · 2008. Szep. 25. (Cs), 06.19
+1
9

Egyet értek.

ZoZZo · 2008. Szep. 25. (Cs), 09.10
Egyet értek veled, hogy php-ből indítani szervert öngyilkosság. De engem az érdekelne, hogy hogyan lehet elindítani egy szerver (webről), ami tudna futni is.

Például ezek az admin panelek hogyan oldották meg? .:

www.tcadmin.com ( Windows-os )
www.gamecp.com ( Linux & Windows-os )

És még sorolhatnám ...

Szoval vagy ha tud nekem valaki ajánlani egy jó ilyen programot a hldStarton kívül, akkor az jó lenne nagyon és kimondottan örülnék.

Vagy valaki esetleg tudna egy jó kis doksit erre, vagy egy jó ingyenes panelt rá, akkor örök hálám érte!

proclub -> Őszíntén szólva az az egyetlen bajom, hogy nekem Kínai amit most elmondtál. Ha picit foglalkozok vele, akkor biztos megértem, vagy ha bővebben bevezetnél a témába. Nem az a célom, hogy hagyjam a francba az egészet, hanem megoldást keresek.

Köszönöm előrre is!

Üdv, Bence.
10

Kifejtve

janoszen · 2008. Szep. 25. (Cs), 09.39
Van millió megoldás. Ha én írnék egy ilyen alkalmazást, valószínűleg írnék egy külön szervert (pl. Perlben vagy C-ben), akihez be tud csatlakozni a PHP (ami korlátozott jogokkal fut) és az a szerver futtatná a többi alkalmazást.

Mivel viszonylag kevés tapasztalatod van, ezért azt mondom, hogy nézz utána a cronjobok működésének. Beteszel egy shell scriptet, ami ha létezik mondjuk a /home/server/server1/kill fájl, akkor kikilleli az 1-es szervert, ha a start nevü fájl létezik, akkor elindítja, stb. PHP-ból egy touch paranccsal létre tudod hozni a fájlokat, viszont biztonságos mert más nem tud csinálni a PHP. Annyi történik hogy a következő egész percben fog elindulni a szoftver, nem azonnal.

Ami az admin paneleket illeti, láttam ott is már elég vad megvalósításokat, pl hogy az admin panelnek root jogokkal kell futnia, ami PHP esetén több mint kockázatos. A Windows process modellt nem ismerem annyira, de ha jól tudom, ott nincs ilyen probléma, mert legrosszabb esetben egy start paranccsal elindítja az alkalmazást és onnantól kezdve nem sok közül vagy egymáshoz.

Ha jól néztem, az általad belinkelt game control panelek nem olyan vészesen drágák, 150 USD azért nem a világ (GameCP) ha pénzt keresel vele. Ha nem keresel pénzt vele, akkor meg valszeg azért belefér, hogy belépsz SSH-n és újraindítod amit újra kell. :)
11

Ez már meg van.

ZoZZo · 2008. Szep. 25. (Cs), 09.43
Köszönöm a gyors válaszod. Ezek nekem már mind megvannak. Csak nem tudom leválasztani a terminált, hogy ne töltölődjön be az oldal folyamatosan, mert nem választja le a terminált és ezáltal folyamatosan tölti az oldalt "mintha ott futna a terminál". Ha bezárom az oldalt, akkor is fut a szerver ha pkill-el leállítom akkor leáll tökéletesen.

Nekem egyedül ez a leválasztós dolog nem megy. Vagy erre van szerver monitorizáló program, ahol lehet figyelni a futú szervereket, stb? Amúgy tudom, hogy most a Google bácsit is kérdezhettem volna, de az a gáz, hogy nem akarom elrontani a dolgokat.

Szal összességében nekem egy olyan "shell-script" kéne ami elindítja a szerver alkalmazást és utánna "elméletben nyit egy új terminált (sessiont)" és a shell script meg leáll, hogy az oldalon lévő töltés is megálljon.

Az fgcklan.hu-nál van egy szerverem eléggé gázoss az admin panell de megoldották mégis valahogy ezt a témát :S... Egy egyszerű php script futtatja le a dolgot és újraindította a szervert. Vaagy lehet, hogy php-ből nem is indítnak el szervert. Hmm. Az lehetséges, hogy egy XXXX nevű programot újraindítsunk execcel?