(MEGOLDVA) Bash szkript, CPU limit

Sziasztok!

Ti hogyan oldanátok meg a következőt:
Adott pár user (változó user szám) egy eléggé elcseszett programmal, ami random indokolatlanul elkezdi a cput pörgetni. Ha lekorlátozom a cpu használatot cpulimittel, akkor is tökéletesen és ugyan úgy fut a program.
Cél: Egy olyan bash scriptet szeretnék írni, ami cronal óránként lefut. (pid szam megvan mivel alapból úgy indítom a programot h generáljon egy filet amiben benne van az adott program pid szama) és bekorlátozza a cput 10%-ra.
A program egy adott userkent fut.
Odáig eljutottam, hogy usereket hogy listázom ki egy fájlba. cd /home/program/userek; ls >userek
User pid: /home/program/user/xxx.pid

Sajnos ehhez a szinthez még elég low vagyok.

Élőrre is köszi minden commentet.

Hozzászólások

Nem nagyon értem, hogy pontosan mit is akarsz...

FathoM

ezért a bash szakértők a fejemet veszik tutira, de fejből erre futotta...

for i in $(ls /home/program/user/*.pid)
do
pid=`cat $i`
cpulimit -p $pid -l 10
done

---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"

Ez már majdnem működő megoldás :)
A következő problémával :(

s1:/home/.....: ./cpulimit.sh
Warning: no target process found. Waiting for it...
^CExiting...
Warning: no target process found. Waiting for it...
^CExiting...
Process 2465 detected
^CExiting...
Process 2483 detected
^CExiting...
Process 2555 detected
^CExiting...
Process 2627 detected
^CExiting...
Warning: no target process found. Waiting for it...
^CExiting...
Warning: no target process found. Waiting for it...
^CExiting...
Process 2573 detected
^CExiting...
Process 1919 detected
^CExiting...
Warning: no target process found. Waiting for it...
^CExiting...
Process 2519 detected
^CExiting...
Process 2609 detected
^CExiting...
Process 5084 detected
^CExiting...
Process 2537 detected
^CExiting...
Warning: no target process found. Waiting for it...
^CExiting...
Warning: no target process found. Waiting for it...
^CExiting...

Ha jól értelmezem akk ami nem fut ott elakad, illetve ha talál futót akkor sem ugrik a következőre.

sanszosan a ls /home/program/ alatt vannak olyan könyvtárak is, ahol nem a userek vannak hanem egyéb, és ott nem talál .pid filet...
innen rád bízom, vagy a for ciklust rakod rendbe, vagy a könyvárstruktúrát.. :)
---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"

A probléma az, hogy a cpulimit nem tér vissza.
Tehát, ha simán consolba beírom:

s1:/home/user/....#
cpulimit -p 5733 -l 10
Process 5733 detected

Nem tér vissza bashba. Másik drotos megoldás ha mindegyik cpulimitet screenbe küldeném. De szerintem az eléggé cigány megoldás :(

Fejet ugyan nem vennék, de azért...

"for i in $(ls /home/program/user/*.pid)"

for i in /home/program/user/*.pid

Egyrészt hogy legyen esély lekezelni, ha netán egyik-másik file nevében lenne szóköz, másrészt mert olcsóbb, mivel se subshell, se ls.

"pid=`cat $i`"

read pid <"$i"/pid

Az okok nagyjából ugyanazok, mint fentebb: ez működik akkor is, ha szóköz van a file nevében, és olcsóbb, mert nincs se subshell, se cat.

En inkabb a nice-al probalkoznek...
---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"

De mi akadályoz meg abban, hogy a programot elugd és betekerd egy wrapper szkriptbe, ami indításkor azonnal ráncba szedi a processzt, ahelyett, hogy cronból vadászod le?

Amit írok, az tkp. csak annyit jelent, hogy az eredeti programot elteszed egy PATH által nem érintett könyvtárba, és a helyére teszel egy szkriptet, ami az eredetit abszolút könyvtárakkal elindítja, és el is végzi azon ugyanazokat a cpu-korlátozásokat, amelyeket cronból kötegelve teszel meg az előző futás óta indítottakkal.

A wrapper másik módja az alias használata (feltételezi, hogy nem fogja elrontani senki a környezetet). Pl.:

alias mc='/usr/local/bin/nemisazmcindulhanemendemajdaztisinditom.sh'