Programiranje v bashu - Nadzorovanje procesov

Pozdravljeni!

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,113
V 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

  • CrazyLemon Skrbnik
    uredil/-a 23. May, 2016
    Dej ti nam raje povej kje se tebi zatakne.. ne pa navodila za reševanje naloge :smile: 
    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.
  • Pridem do koraka, ko ne znam prešteti vseh aktivnih procesov.
    Č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.
  • CrazyLemon Skrbnik
    uredil/-a 24. May, 2016
    Kaj ti pa izpiše
    ps h -C xclock | wc -l


  • haljaz je dejal/-a:
    Ukaz, pod mojo temo Nadzorovanje procesov mi ne dela, ker so lahko procesi enaki, le da imajo nekateri relativno, drugi pa absolutno pot.
    Še vedno lahko uporabiš prvi del kode.
    ps h -C xclock 

    ti izpiše tako relativno kot absolutno pot.. če ne želiš absolutne dodaš nekaj v smislu

    ps h -C xclock | awk '{print $5}' | grep -v "/"

    Č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
  • CrazyLemon Skrbnik
    uredil/-a 25. May, 2016
    Zato ker peti vsebuje absolutno pot :smile: 
    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.
    ps h -C xclock | awk '{print $5}' | cut -d '/' -f4

    Kdaj je pa rok naloge? :smile: 

  • 27.5 2 dni
  • Ampak vaš ukaz še vedno ne izpisuje argumentov :(

    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.
  • CrazyLemon Skrbnik
    uredil/-a 26. May, 2016
    Jah ne bom vam cele naloge rešil madona :smile: 
    a veš kaj počne awk '{ print $5 }' ? no mogoče tam moraš dodat še kaj da ti sprinta še kak stolpec zravn :wink: 

    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
Za komentiranje se prijavite ali pa se vpišite.