Re: reparenting procesu po preruseni ssh spojeni

2020-03-25 Tema obsahu Dan Lukes

Miroslav Lachman wrote on 25. 3. 2020 14:59:

3. chybu procesu, ktery se rozhodne se neukoncovat.


Kdyz je v systemu takhel zaseknuty proces, je nejaka moznost, jak se k 
nemu pripojit nejakym debugovacim nastrojem a zjistit, proc / na cem se 
zaseknul? V tomhle jsem absolutne nezkuseny...


Debuggery jsou schopny se pripojit i k bezicimu procesu. A pokud je 
binar s debugovacima informacema a mas  k dispozici zdrojaky ze kterych 
by prelozen, budou ti umoznovat debugovani i v zdrojovem kody high-level 
jazyka ve kterym byl napsan.


Hackem muze byt:
1. proces pouziva sdilene knihovny a akualne se nachazi v nejaek takove. 
Neni to problem pokud vyse ivedene plati i pro dotcenou knihovnu (je 
prelozena s debugovacimi informacmei a mas zdrojaky).


2. proces provedl syscall a ten dosud neskoncil (tzn. provadi se 
in-kernel kod).



Tak mu omez maximalni dovoleny spotrebovany cas procesoru.

Pod stejnym uzivatelem se na tom serveru spousti vice uloh.


Limit je na kazdy proces.

Funguje tohle tak, ze se ten limit z login.conf bude aplikovat jen na ten 
konkretni proces, ktery presahne ten CPU time? Tzn. opravdu to killne 
jen tenhle vadny proces?


Signal SIGXCPU dostane jen proces, ktery prekrocil svuj soft limit. Ale 
nemusis to nutne globalne nastavovat v login.conf - na prikazove radce 
na to je prikaz ulimit, dalsi moznost je, ze si limit proces nastavi sam 
(v PHP funkce  posix_setrlimit)



RESOURCE LIMITS
  Name   Type  Notes Description
  cputime    time    CPU usage limit.

"time" ma jakou jednotku? Pocet sekund, ktere muze proces sezrat na CPU 
a pak dojde k jeho ukonceni?


setrlimit to bere v sekundach, takze predpokladam, ze to tady bude 
stejne. Uz je to moc davno, co jsem to naposled pouzil ...


Dan


--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l


Re: reparenting procesu po preruseni ssh spojeni

2020-03-25 Tema obsahu Miroslav Lachman
Jelikoz se problem dnes zase vyskytl nekolikrat po sobe, tak se k tomuto 
tematu vracim...


Dan Lukes wrote on 2020/03/14 09:49:

3. chybu procesu, ktery se rozhodne se neukoncovat.


Kdyz je v systemu takhel zaseknuty proces, je nejaka moznost, jak se k 
nemu pripojit nejakym debugovacim nastrojem a zjistit, proc / na cem se 
zaseknul? V tomhle jsem absolutne nezkuseny...



Mozne reseni:
a) oprava procesu aby se takhle nechoval (muze to byt chyba PHP nebo 
dusledek vady interpretovaneho PHP kodu)

nebo
b) napsat wrapper, spoustet ze sshd ten a ktery teprve bude volat 
postizeny proces a ktery bud etransparentni az na ten SIGHUP, ktery 
nebude dolu predavat 1:1 a misto nej posle jiny signal, na ktery proces 
reagovat ochotny je, propadne SIGKILL, ktery sam obslouzit (a tedy 
ignorovat) nemuze.


Ten wrapper by taky byla moznsot, ale nejsem si jisty, jestli tu zmenu 
akceptuje klient (budou muset zmenit neco na sve strane s Jenkinsem)



Zrejme dalsi prizmak vady toho SW.
Tak mu omez maximalni dovoleny spotrebovany cas procesoru. Po prelezeni 
sift limitu dostane SIGXCPU coz ho defaultne taky ukonci, ale i tohle 
muze ignorovat. Prelezeni hard limitu by ale uz prezit nemel.


Pod stejnym uzivatelem se na tom serveru spousti vice uloh. Funguje 
tohle tak, ze se ten limit z login.conf bude aplikovat jen na ten 
konkretni proces, ktery presahne ten CPU time? Tzn. opravdu to killne 
jen tenhle vadny proces?


V manualu k login.conf je

RESOURCE LIMITS
 Name   Type  Notes Description
 cputimetimeCPU usage limit.

"time" ma jakou jednotku? Pocet sekund, ktere muze proces sezrat na CPU 
a pak dojde k jeho ukonceni?


Mirek
--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l


Re: reparenting procesu po preruseni ssh spojeni

2020-03-14 Tema obsahu Jindrich Fucik

Dne 14.3.2020 v 9:49 Dan Lukes napsal(a):

Miroslav Lachman wrote on 12. 3. 2020 16:45:
Zil jsem v domeni, ze kdyz se prerusi SSH spojeni, tak proces, ktery 
byl spusten uzivatelem skrz to SSH spojeni, se taky ukonci. 


Hacek je zakopany v presnem popisu.

A ten se ti dokonce (asi neumyslne) podaril. Skutecne - *proces* se 
ukonci.  Myslim aktivne - musi to udelat on. No a nektery proces se 
proste neukonci.


Pokud bychom se chtěli hrabat v nechutných podrobnostech, tak celkem 
běžné je, že proces zrovna v tu dobu, kdy mu přišel SIGHUP dělá nějaké 
systémové volání, které trvá dlouho (čtení z pásky). Systém takový 
signál nepřijme, ale "odloží" ho na dobu, kdy bude proces zase ve "svém" 
kontextu.
Existují volání, která se dokáží docela slušně pokazit, ale to se pak 
celkem dost pozná, že plní systémový log. Třeba o poškozeném disku nebo tak.

To ale asi nebude tvůj případ.
--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l


Re: reparenting procesu po preruseni ssh spojeni

2020-03-14 Tema obsahu Dan Lukes

Miroslav Lachman wrote on 12. 3. 2020 16:45:
Zil jsem v domeni, ze kdyz se prerusi SSH spojeni, tak proces, ktery byl 
spusten uzivatelem skrz to SSH spojeni, se taky ukonci. 


Hacek je zakopany v presnem popisu.

A ten se ti dokonce (asi neumyslne) podaril. Skutecne - *proces* se 
ukonci.  Myslim aktivne - musi to udelat on. No a nektery proces se 
proste neukonci.


Tak ja to radsi popisu jinak.

Kdyz spadne SSHD, proces by od nej mel dostat signal SIGHUP. Signal je 
procesem prijat a obslouzen, pricemz defaultni obsluzna rutina aktivne 
ukonci proces (sama sebe). Ale konkretni proces nemusi nechat reagovat 
defaultni obsluznou rutinu, muze instalovat vlastni nebo aktivovat 
"igoruj" obsluhu signalu ...



Rodicem toho procesu se stal PID 1 (init).


Kdyz umre rodicovsky proces a child neskonci, pak se jeho rodicem stava 
init.



A jak tomu zabranit?


Pokud ...
1. nejde o chybu SSHD (dokaze zabranit tomu, aby se pri jeho konci detem 
SIGHUP poslal)

2. nejde o chybu systemu (odeslany signal se nedoruci)
pricemz
na tyhle chyby to nevypada, kdyz u jinych procesu to funguje spravne
tak jde o
3. chybu procesu, ktery se rozhodne se neukoncovat.

Mozne reseni:
a) oprava procesu aby se takhle nechoval (muze to byt chyba PHP nebo 
dusledek vady interpretovaneho PHP kodu)

nebo
b) napsat wrapper, spoustet ze sshd ten a ktery teprve bude volat 
postizeny proces a ktery bud etransparentni az na ten SIGHUP, ktery 
nebude dolu predavat 1:1 a misto nej posle jiny signal, na ktery proces 
reagovat ochotny je, propadne SIGKILL, ktery sam obslouzit (a tedy 
ignorovat) nemuze.


Zrovna v tomhle pripade bych potreboval, aby ten proces taky umrel. I 
kdyz mi neco naseptava, ze neni normalni ani to, ze tam ten proces 
zustane bezet klidne 20 hodin a zere veskery CPU (tzn. je tam neco hodne 
spatne)



Zrejme dalsi prizmak vady toho SW.
Tak mu omez maximalni dovoleny spotrebovany cas procesoru. Po prelezeni 
sift limitu dostane SIGXCPU coz ho defaultne taky ukonci, ale i tohle 
muze ignorovat. Prelezeni hard limitu by ale uz prezit nemel.


Dan
--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l