Programiranje v bashu - Nadzorovanje procesov
Rad bi napisal program v skriptnem jeziku, ki zagotavlja, da določeni strežniški programi vedno tečejo z določenim številom instanc.
Skripta naj bi dobila 2 argumenta. Prvi argument je interval v sekundah (na koliko sekund naj preverja število instanc), drugi argument pa imenovan cevovod, preko katerega skripta prejema ukaze (npr. "imeSkripte.sh 1 inputpipe" #V tem primeru skripta v enosekundnih intervalih preverja število instanc, ukaze pa prejema preko cevovoda inputpipe).
Preko cevovoda naj bi skripta prejemala le ukaze proc, log, stop in exit. Neznane ukaze ali ukaze z napačnimi argumenti skripta le ignorira.
Ukaz exit ne dobiva nobenih argumentov, ukaz log je lahko brez ali pa z argumentom last, ukaz stop kot argument dobi ukazno vrstico s kanonično potjo do programa z argumenti, s katerimi je program pognan. Ukaz proc sprejme kot argumenta (argumenta sta ločena z dvopičji) ciljno število instanc določenega programa in PID vsaj ene že obstoječe instance programa (če je podanih več PIDov, so ločeni z vejicami).
Na primer, da imamo dva procesa xclock s PID 50 in 113 in želimo imeti vedno 3 aktivne instance programa xclock (2 že imamo), pošljemo skripti preko cevovoda naslednji ukaz:
proc:3:50,113V tem primeru najprej skripta preveri, če PIDa res pripadata instanci istega programa in preveri tudi, da sta bili obe instanci pognani z istimi argumenti. Npr. če prvi PID pripada instanci programa, ki smo jo pognali kot xclock in drugi PID instanci, ki smo jo pognali kot xclock -digial, sta to instanci istega programa, vendar nista pognani z istimi argumenti. Če katerikoli izmed PIDov ne pripada istemu programu ali ni pognan z istimi argumenti kot ostali, na standardni izhod za napake izpišite "PID matching error: " in vse PIDe iz ukaza, ki je bil problematičen. Na primer: "PID matching error: 50,113". Če poženemo program xclock absolutno ali relativno z neke lokacije (npr. xclock -digital in /usr/bin/xclock -digital), sta to instanci istega programa, pognani z istimi argumenti. Pri primerjavi se omejimo na kanonično pot do programa in na seznam argumentov, ne bomo pa primerjali okolijskih spremenljivk (npr. PWD, PATH), čeprav se le-te lahko razlikujejo.
Če se instance ujemajo, potem pa je potrebno doseči ciljno število procesov . Da se sistem ne bo preobremenil zaradi prevelikega števila zagonov v kratkem času, naj se programi zaganjajo v n-sekundnih intervalih (prva nova instanca se požene takoj, druga po n-sekundah, tretja po n-sekundah za drugo itd.). Dolžino intervala smo podali kot prvi argument skripti. Če je število procesov že doseženo (ali preseženo), se ne zgodi nič, razen če število procesov pade pod želeno mejo, v tem primeru začnemo kreirati nove procese.
Če preko ukaza proc pošljemo PID procesa, ki je instanca programa z argumenti, ki ga že upravljamo, na standardni izhod za napake izpišemo opozorilo ("Run configuration already exists."), ukaz pa ignoriramo.
Ko prejmemo ukaz log, v datoteko active.log, izpišemo najprej časovno oznako (date +%s%3N), potem pa za vsak program vrstico s kanonično potjo do programa vključno s stikali in vrstico s seznamom vseh PIDov instanc tega programa. PIDe ločite s presledki. Primer izpisa za instanci s PIDoma 50 in 113 programa, ki smo ga pognali kot xclock -digital; poleg tega pa imamo še eno instanco cat -A.
1463135011196
/usr/bin/xclock -digital
50 113
/bin/cat -A
220
Če prejmemo ukaz log last, potem zapišemo v datoteko active.log časovno oznako in podatke o procesih, ki se nanašajo samo na zadnji poslani ukaz za zagon procesov preko cevovoda.
Če prejmemo ukaz stop, potem se ustavi nadzor nad pripadajočimi procesi, procesi pa ostanejo aktivni. Na primer, če pošljemo ukaz:
stop:/usr/bin/xclock -digital
se prekine nadzor nad procesi /usr/bin/xclock -digital, torej ne ustvarjamo več novih procesov, obstoječi procesi pa še vedno ostanejo aktivni. Sedaj lahko z ukazom proc ponovno pošljemo ukaz, ki vzpostavi nadzor nad procesi, če želimo.
Ko prejmemo ukaz exit, se skripta za zaganjanje procesov ukine.
Če bi mi kdo znal na kakršenkoli način pomagati, bi mu bil zelo hvaležen!
Lp
Komentarji
Za začetek razbij nalogo na več manjših podnalog.
Naprej usposobiš recimo sprejemanje argumentov, nato začne s preverjanjem PIDov in štetjem le teh, nato to preveriš na X sekund, nato se lotiš pogoja, kaj če je manj kot X pidov itn.
Če npr. odprem jobs-l in sem pred tem zagnal xclock, xclock in xclock-digital.
Želim prešteti samo xclock procese, vendar mi vedno vrne številko 3.
ti izpiše tako relativno kot absolutno pot.. če ne želiš absolutne dodaš nekaj v smislu
Če želiš absolutno pa odstraniš tisti -v pri grepu
Kot lahko vidite je ukaz vrnil 4 procese tako kot ste si zamislili brez absolutne poti. Ampak težava je v tem, da moramo ločit procese, ki so podani tako z argumenti kot brez argumentov. Vaš ukaz vrne 4 procese vse poimenovanje xclock. Jaz pa potrebujem, da mi ukaz vrne procese brez absolutne poti. V mojem primeru pričakujem primer:
xclock
xclock
xclock -digital
xclock -digital
xclock
ps. Ne vem zakaj je veš ukaz vrnil 4 procese medtem ko z ukazom jobs -l lahko vidimo, da vrne 5 procesov.
Lp
Aja..vi potrebujete da se odstrani absolutna pot in da so našteti samo procesi..
Pol je potrebno odstranit stran /*/*/
To lahko počnemo z ukazom cut.
Kdaj je pa rok naloge?
Kot sem že v zgornji objavi napisal potrebujem zraven izpisane tudi argumente (v tem primeru -digital) ker moramo procese z argumenti in brez argumentov ločit med sabo.
a veš kaj počne awk '{ print $5 }' ? no mogoče tam moraš dodat še kaj da ti sprinta še kak stolpec zravn
P.s. Sej ne rabiš vsakič slikco prilepit za izpis. Označiš, kopiraš, prilepiš na forum, označiš še enkrat, klikneš na obrnjen P in daš 'Koda' pa je