[PHP - MySQL] Több (játék)szerver indítás
2015-09-09T01:57:31+02:00
2015-10-03T22:00:42+02:00
2022-08-18T09:20:33+02:00
deruljason
Sziasztok!

Adott egy debian szerver egy mysql adatbázissal, amiben van egy "szerverek" mező, abban van:
`ip` , `port`, `game`, `slot`, `mappa`, `cmdline` , `screenname` , `fajl` , `felh` mező.

Valamint van benne 8db játékszerver ip-vel,port-tal,elérési mappával stb.

Na most én ssh kapcsolattal szeretném elindítani a szervereket úgy, hogy az adatbázisból a "mappa" mező a szerver elérési útvonala, a "fajl" mező pedig a szerver indító fájlja, többi logikus (gondolom) ez megy is, ki is listázza a 8 szervert, de akármelyiknél rányomok a szerver indítása linkre csak azt a szervert hajlandó elindítani amelyik a táblában az első...

Hogyan tudnám működésre bírni úgy,hogy azt a  szervert indítsa el , amelyik szervernél rákattintok a szerver indításra?

Ez lenne a szerverindító funkció:

function sz_start($id, $mysql_kap){ $adat_lekeres= mysql_query("SELECT * FROM szerverek WHERE felh='".$_SESSION['felh']."'", $mysql_kap); $adat_row= mysql_fetch_assoc($adat_lekeres); sshx_exec($id, $mysql_kap, 'cd '.$adat_row['mappa'].' ; screen -A -m -d -S '.$adat_row['screenname'].' ./'.$adat_row['fajl'].' "'.$adat_row['cmdline'].'"'); sleep(3); print "<b><font color='green'>Szerver indítása kész!</font></b>"; }
Mutasd a teljes hozzászólást!
Minek futsz felesleges köröket? És minek nyúzod a vasat egy + nyitott szállal (amiben a php exec fut)?

Ha csak 8 szerver van, IP, útvonal stb... nem változik, akkor írj egy bash scriptet, adj neki megfelelő jogosultságot és mikor ssh-val beléptél futtasd le a kívánt paraméterrel. pl.
run_my_game_server.sh --start --game hobelebanc_multi & és kész.
Mutasd a teljes hozzászólást!

  • És a hibaüzenetet meg találjuk ki magunk, amit kapsz a jelenlegi kódodnál?

    1. Biztos, hogy egy felhasználónak csak 1 szervere lehet?
    2. Hol kapcsolôdsz az ssh-hoz?
    3. Mi az az sshx_connect()?
    4. Ez a kód gyakorlatilag ennek a kódnak a másolata. Te is ezt a webadmint használod, vagy csak copy-paste módon fogtad ezt a kôdot, bemásoltad, aztán csodálkozol, hogy nem megy?
    Mutasd a teljes hozzászólást!
  • Minek futsz felesleges köröket? És minek nyúzod a vasat egy + nyitott szállal (amiben a php exec fut)?

    Ha csak 8 szerver van, IP, útvonal stb... nem változik, akkor írj egy bash scriptet, adj neki megfelelő jogosultságot és mikor ssh-val beléptél futtasd le a kívánt paraméterrel. pl.
    run_my_game_server.sh --start --game hobelebanc_multi & és kész.
    Mutasd a teljes hozzászólást!
  • 1. Nem, egy felhasználónak több szerverre is szüksége lenne, ha van 8 felhasználó, és azon 1 szerver, akkor működik, elindulnak a szerverek.. ha 1 felhasználón, akkor nem és nekem ezt kellene megoldanom, hogy 1 felhasználón van 8 szerver és azokat elindítsa természetesen a "cmdline" mezőben mind a 8 szervernek más port van megadva, amit le is futtat az első szerver esetében, de a többi szervert egyáltalán nem próbálja meg elindítani sem.
    2.
    function sshx_exec($id, $mysql_kap, $parancs){ $adat_lekeres= mysql_query("SELECT * FROM szerverek WHERE WHERE id='".$_SESSION['id']."'", $mysql_kap); $adat_row= mysql_fetch_assoc($adat_lekeres); $ssh_kapcsolat = ssh2_connect($adat_row['ssh_ip'], $adat_row['ssh_port']); ssh2_auth_password($ssh_kapcsolat, $adat_row['ssh_user'], $adat_row['ssh_pass']); if($ssh_kapcsolat){ $ssh_parancs= ssh2_exec($ssh_kapcsolat, $parancs); stream_set_blocking($ssh_parancs, true); //while($ssh_out = fgets($ssh_parancs)){ // print $ssh_out; //} }else{ print "<b><font color='red'>SSH kapcsolódás közben hiba történt!</font></b>"; } fclose($ssh_parancs); }
    3. Nincs sshx_connect() csak sshx_exec, ez a funkciót pedig a 2. pontnál leírtam.
    4. Ugyanezt a webadmint szeretném épp átalakítani.
    Mutasd a teljes hozzászólást!
  • Egy kérdés mielőtt tovább mennénk:

    A PHP scripted és a játék szerver appok ugyanazon a gépen vannak vagy más, távoli gépen?
    Mutasd a teljes hozzászólást!
  • Ugyanazon a gépen.
    Mutasd a teljes hozzászólást!
  • // próbáld meg esetleg emígyen:

    sshx_exec($adat_row['id'], $mysql_kap, 'cd '.$adat_row['mappa'].' ; screen -A -m -d -S '.$adat_row['screenname'].' ./'.$adat_row['fajl'].' "'.$adat_row['cmdline'].'"');
    Mutasd a teljes hozzászólást!
  • Na akkor:

    saját gépen minek is kell az ssh? Csak gondolkozz el "paraszti ésszel", logikusan:
    ssh2_exec — Execute a command on a remote server resource ssh2_exec ( resource $session , string $command [, string $pty [, array $env [, int $width = 80 [, int $height = 25 [, int $width_height_type = SSH2_TERM_UNIT_CHARS ]]]]] ) Execute a command at the remote end and allocate a channel for it. sample: <?php $connection = ssh2_connect('shell.example.com', 22); ssh2_auth_password($connection, 'username', 'password'); $stream = ssh2_exec($connection, '/usr/local/bin/php -i'); ?> Returns a stream on success or FALSE on failure.

    2; nem vagy tisztában a unix/linux működési elvével. Mert az esetedben (legalábbis amit eddig leírtál) egy linux daemon command scriptet kellene megírnod paraméterezve amit php-ból a felhasználó jogosultságainak ismeretében meghívsz sima exec-ben. A külső daemon skript miután kiadta a parancsot átadja a vezérlést a kernelnek, ami ad egy vissza térési üzenetet, s ezzel befejezi a látszólagos műkódését, de a háttérben tovább fut. S ez üzenet átkerül a php scriptnek, ami utánna folytatja működését. Ha te közvetlenül php-ból adod ki a parancsot és amíg fut a játék (ha közben hibával el nem száll) nincs visszatérési érték és a config alapján egy time out-ot fogszkapni.
    3; a natív mysql_*() funkciók deprecated státuszban vannak. Felejtsd el őket. használd a PDOt.
    4; a php kódod egy káosz.
    5;if($ssh_kapcsolat) ssh2_exec után így stream_set_blocking ... ezt hogy gondoltad? FALSE-val elszáll az egész.Mert TRUE-t vársz, de az nem érkezik mert még fut az első játék. (megj. szerintem válasz hiányában time-out-tal szál el, de nézd meg a logot.)
    Mutasd a teljes hozzászólást!
  • Köszi, de így sem akar működni
    Mutasd a teljes hozzászólást!
  • Pont azért, mert nem vagyok teljesen tisztában a unix/linux működési elvével, véleményem szerint egyszerűbb az ssh.

    Működik is, de 1 felhasználó - 1 szerverrel.. ha már több szerver van 1 felhasználónál, akkor csak az elsőt hajlandó kezelni.
    Mutasd a teljes hozzászólást!
  • véleményem szerint egyszerűbb az ssh.

    Nem, neked lövésed sincs, hogy melyik az egyszerűbb, de ssh-hoz találtál copy-paste kódot, szal gondoltad, azt fogod használni.

    Nem, egy felhasználónak több szerverre is szüksége lenne, ha van 8 felhasználó, és azon 1 szerver, akkor működik, elindulnak a szerverek.. ha 1 felhasználón

    Ha egy felhasználó nevén van több szerver, akkor az indításhoz szükséges paramétereket lekérdező sql-ben miért a felhasználó nevére szűrsz? Az a lekérdezés ugye minden olyan konfig adatot vissza fog adni, ami ahhoz a felhasználóhoz tartozik. Pont ezért csak az 1. indul el mindig, hiszen order by hiányában a rekordok fizikai elhelyezkedése adja meg a visszaadott rekordok sorrendjét. A szerver táblába tegyél egy autoincrement-es mezőt (mondjuk legyen a neve id) és erre az id-re szűrjél, ha el akarod indítani a szervert.

    És ne használj ssh-t.
    Mutasd a teljes hozzászólást!
  • Pont ezért csak az 1. indul el mindig, hiszen order by hiányában a rekordok fizikai elhelyezkedése adja meg a visszaadott rekordok sorrendjét.


    Ennek így nincs jelentősége, ha nem daemon-ként indítja el a játék szervert. Mert máskülönben az apparmor fogja blokkolni az adott usernek a második szerver indítását. (bár ezt configban ki lehet lőni)
    Mutasd a teljes hozzászólást!
  • És hogy tudom kilőni configban?
    Mutasd a teljes hozzászólást!
  • /etc/apparmor.d/tunables/kernelvars
    # Copyright (C) 2012 Canonical Ltd. # # This program is free software; you can redistribute it and/or # modify it under the terms of version 2 of the GNU General Public # License published by the Free Software Foundation. # # ------------------------------------------------------------------ # This file should contain declarations to kernel vars or variables # that will become kernel vars at some point # until kernel vars are implemented # and until the parser supports nested groupings like # @{pid}=[1-9]{[0-9]{[0-9]{[0-9]{[0-9]{[0-9],},},},},} # use @{pid}={[1-9],[1-9][0-9],[1-9][0-9][0-9],[1-9][0-9][0-9][0-9],[1-9][0-9][0-9][0-9][0-9],[1-9][0-9][0-9][0-9][0-9][0-9]} #same pattern as @{pid} for now @{tid}=@{pid} # ezt meg ki kommentezed és beírod helytte @t{tid}=@acme{pid} #A pattern for pids that can appear @{pids}=@{pid} # ezt a sor kicseréled # @{pids}=@{pid}+%1 -re
    Mutasd a teljes hozzászólást!
  • Azért van jelentősége, mert ha ne módosítja a kódot, akkor hiába lő ki bármit is apparmor-ban, akkor sem fogja tudni elindítani a többi szervert.
    Mutasd a teljes hozzászólást!
  • A php kódját annyira nem néztem, de unix/linux alatt egy thread / PID szálból indított exec amíg nem fejezte be a működését alpból nem tudsz másikot indítani. És minek után játék szervert szeretne futtatni az nem 1-2 mp alatt fut le. Így ebben az esetben , miként azt korábban is írtam egy külső daemond skript ből kellene indítani, amit átvesz a kernel, ami vissza ad egy üzenetet [pl. server started sucessfully] és innentől a php script is fut tovább.

    --[megj: amit korábban linkeltél, ahonnan sz.val átvette a kódot ott egy screen lekérdezés volt, az max 1-2 mp alatt lefut egy válasszal és a vezérlés vissza kerül a php-hoz. Ez az exec hívás rendben is van, de egy járék szerver exec indítása után mikor fog vissza kerülni?

    A kernelvars módosítását meg csak kivételes esetben tanácsolom. De itt csak megemlítettem, hogy ki lehet lőni, azaz felülírni.
    Mutasd a teljes hozzászólást!
  • Én nem vitatom, amit írtál a játék szerver indításról eddig sem. Én csak arra mutattam rá, hogy a php / sql kód hibája miatt esélye sincs elindítani a többi szervert. Még akkor se, ha minden mást rendbe tesz az exec ssh2_exec() terén.
    Mutasd a teljes hozzászólást!
  • Ezt én sem vitatom.... korábban írtam, hogy a kérdező kódja egy káosz és nincs tisztában bizonyos dolgokkal. Ha jó az sql lekérdezése, ha nem, az első parancssor után alap config linux(debian) alatt sem tudna többet kiadni. Pont.

    Esetében meg az ssh abszolút felesleges.

    Megegyeztünk?
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Szegény játékszerver tulajok :S
    Mutasd a teljes hozzászólást!
abcd