Jak „odblokovat“ porty?

MrDojo

Jak „odblokovat“ porty?
« kdy: 15. 12. 2012, 21:32:42 »
Zdravím,

mám problém... Mám server s Debianem (squeeze, pravidelně aktualizovaný pomocí příkazu apt get upgrade a update) a na něm Bukkit (Minecraft server - běží v terminálu). Ten Bukkit (web:bukkit.org) občas spadne a je potřeba ho manuálně nahodit.
Pokud spadne tak se řádně neukončí a nejde spustit bez restartu celého serveru-HW, protože port na kterém má běžet Bukkit je obsazený stále běžcím Bukkitem (na který se však nelze připojit a hrát)

Jsem ve správě serveru lama, takže mám v Debianu grafické prostředí - vím že to není dobré, ale jakmile si budu jistý v příkazech odstraním ho

Můje dotazy jsou:
1) Jak manuálně - tj. v terminálu ukončit běžící proces - vyčistit port (aby nebyl obsazený a mohl jsem ho znova použít)
2) Jak automaticky (asi pomocí Cronu, ale nevím jak) zjistit, zda Bukkit je funkční či nikoli a pokud tak ho znova spustit (ukončit a spustit)
3) Jak při startu (ne až po přihlášení) spustit aplikaci nebo jak zajistit start grafického prostředí bez připojeného monitoru - graf. prostředí nenaběhne a začne nabíhat, až když připojím monitor

Děkuji.
Dojo
« Poslední změna: 16. 12. 2012, 12:53:34 od Petr Krčmář »


Franta <xkucf03/>

Re:Jak "odblokovat" porty?
« Odpověď #1 kdy: 15. 12. 2012, 21:44:20 »
Citace
1) Jak manuálně - tj. v terminálu ukončit běžící proces - vyčistit port (aby nebyl obsazený a mohl jsem ho znova použít)

Použij příkaz kill a číslo procesu. Číslo procesu zjistíš z výpisu ps aux nebo z nějakého souboru, kam ho program ukládá (dělí-li to). Nebo můžeš zabít všechny instance daného procesu příkazem: killall název_programu.

Když se program takhle nechce ukončit, můžeš ho přinutit přidáním parametru -9

Citace
2) Jak automaticky (asi pomocí Cronu, ale nevím jak) zjistit, zda Bukkit je funkční či nikoli a pokud tak ho znova spustit (ukončit a spustit)

Definuj, co znamená „funkční“ – pokud stačí, aby proces běžel, použij třeba příkaz pgrep. Pokud se ale program může zaseknout a být ve stavu, že sice běží, ale nefunguje, budeš to muset zjišťovat nějakým složitějším způsobem – např. se připojit na TCP port, na kterém naslouchá, poslat mu nějaký příkaz a zkontrolovat odpověď.

Citace
3) Jak při startu (ne až po přihlášení) spustit aplikaci

Napiš si init skript nebo dej příkaz do /etc/rc.local – ale pozor, to ho spustí pod rootem, takže musíš přidat ještě nějaké to su nebo sudo.

Eskymák

Re:Jak "odblokovat" porty?
« Odpověď #2 kdy: 15. 12. 2012, 22:11:00 »
Mě by zajímalo jestli lze uvolnění portů po havarované aplikaci nějak urychli, sám řeším podobný problém u jiné serverové aplikace, která po pádu (kdy ani proces neběží) nelze znovu spustit neboť je obsazen port. Po pár minutách je to ok takže by mě zajímalo jestli to nelze nějak urychlit.
Snad nevadí jsem sem si sem přidal svůj problém :-)

btw, já místo toho abych spouštěl aplikaci po startu bez přihlašení tak jsem nastavil automatické přihlášení. (jednoduší než psát nějaký byť i jednoduchý skript)

tadeas

Re:Jak "odblokovat" porty?
« Odpověď #3 kdy: 16. 12. 2012, 11:22:34 »
lsof -i :<číslo portu>
případně netstat -unpvat

Kterýkoliv z těhle příkazů nám řekne číslo procesu, který poslouchá na daném portu. Pak stačí kill -9 <pid>. Ta minus devítka je důležitá, protože pokud se program má vypnout a nevypnul, tak mu normální SIGTERM stačit asi nebude (SIGTERM = prosím ukonči se, SIGKILL = násilím tě ukončuji). Více info viz man signal.

tadeas

Re:Jak "odblokovat" porty?
« Odpověď #4 kdy: 16. 12. 2012, 11:26:14 »
Mě by zajímalo jestli lze uvolnění portů po havarované aplikaci nějak urychli, sám řeším podobný problém u jiné serverové aplikace, která po pádu (kdy ani proces neběží) nelze znovu spustit neboť je obsazen port. Po pár minutách je to ok takže by mě zajímalo jestli to nelze nějak urychlit.
Tohle se mi občas děje taky a jak to urychlit nevím. Jde o to, že kernel má file deskriptor alokovaný a nedokáže ho uvolnit - celé je to záležitost kernelu, takže s tím z userspace nic neudělám. Stává se to, pokud mám nějaký "nakřáplý" disk, který reaguje pomalu/vůbec.


Re:Jak "odblokovat" porty?
« Odpověď #5 kdy: 16. 12. 2012, 12:09:44 »
Mě by zajímalo jestli lze uvolnění portů po havarované aplikaci nějak urychli, sám řeším podobný problém u jiné serverové aplikace, která po pádu (kdy ani proces neběží) nelze znovu spustit neboť je obsazen port. Po pár minutách je to ok takže by mě zajímalo jestli to nelze nějak urychlit.
Pokud není socket korektně uzavřen, zůstane port ve stavu TIME_WAIT a je uvolněn až po odtikání timeoutu. V téhle době ho není možné znovu použít. Pokud ho vysloveně chci přesto použít, je potřeba nastavit pomocí setsockopt flagy SO_REUSEADDR a SO_REUSEPORT, které umožní port/adresu použít.

Viz
http://www.unixguide.net/network/socketfaq/2.7.shtml
http://www.unixguide.net/network/socketfaq/4.5.shtml
man setsockopt
less sys/socket.h

Re:Jak "odblokovat" porty?
« Odpověď #6 kdy: 16. 12. 2012, 12:12:50 »
P.S. jestli to není úplně jasné, ty flagy musí nastavit ta aplikace, která socket otevírá. Čili pokud je to poravdu potřeba, je nutné opravit zdrojáky toho herního serveru.

Že by šlo port nějakým způsobem násilně zavřít zvenku (jinou aplikací), o tom nevím.

Zopper

  • *****
  • 752
    • Zobrazit profil
Re:Jak "odblokovat" porty?
« Odpověď #7 kdy: 16. 12. 2012, 12:19:03 »
Ještě by šlo změnit hodnotu TIME_WAIT, ne? Sice to asi půjde akorát úpravou kernelu a vlastní kompilací, ale... :D

Re:Jak "odblokovat" porty?
« Odpověď #8 kdy: 16. 12. 2012, 12:28:57 »
Ještě by šlo změnit hodnotu TIME_WAIT, ne? Sice to asi půjde akorát úpravou kernelu a vlastní kompilací, ale... :D
Ono to tam ale není pro srandu králíkům, má to svůj význam :)

Citace
    TIME-WAIT - represents waiting for enough time to pass to be sure
    the remote TCP received the acknowledgment of its connection
    termination request.
http://tools.ietf.org/html/rfc793

MrDojo

Re:Jak "odblokovat" porty?
« Odpověď #9 kdy: 16. 12. 2012, 14:23:15 »
Díky moc za odpovědi!


Definuj, co znamená „funkční“

Bukkit občas jakoby spadne (pořád běží v terminálu, ale nejde tam ani psát příkazy ani nefunguje-nelze se připojit)...

Trident

Re:Jak "odblokovat" porty?
« Odpověď #10 kdy: 18. 12. 2012, 02:28:26 »
Mě by zajímalo jestli lze uvolnění portů po havarované aplikaci nějak urychli, sám řeším podobný problém u jiné serverové aplikace, která po pádu (kdy ani proces neběží) nelze znovu spustit neboť je obsazen port. Po pár minutách je to ok takže by mě zajímalo jestli to nelze nějak urychlit.
Pokud není socket korektně uzavřen, zůstane port ve stavu TIME_WAIT a je uvolněn až po odtikání timeoutu. V téhle době ho není možné znovu použít. Pokud ho vysloveně chci přesto použít, je potřeba nastavit pomocí setsockopt flagy SO_REUSEADDR a SO_REUSEPORT, které umožní port/adresu použít.

Viz
http://www.unixguide.net/network/socketfaq/2.7.shtml
http://www.unixguide.net/network/socketfaq/4.5.shtml
man setsockopt
less sys/socket.h
Ano. Ale prase je prase. Co takhle pouzit cutter  ?

Re:Jak "odblokovat" porty?
« Odpověď #11 kdy: 18. 12. 2012, 09:29:48 »
Co takhle pouzit cutter  ?
To jsem neznal, pro FreeBSD ani MacOS neni.

Podle manualu to ale nejspis nebude fungovat, ne? Jestli to chapu dobre, je to urcene pro falesne ukonceni spojeni na routeru - poslani FIN na obe strany.