Cuma, Mart 10, 2006

...Ruby Bölüm 2

Hiç hız kesmeden yeni kodlarla devam edelim. Bu programımız da işletim sisteminde çalışan süreçleri takip ederek bir dosyaya yazıyor. ve bu dosyayı belirli aralıklarla okuyor. Eğer ardışık iki okumada bir süreç belirli bir cpu kullanım % sini aşmışsa o süreci öldürüyor. Programın içinde Ruby ye ek olarak awk da kullandım.
def anaProgram
# sistemde calisan sürecler listeleniyor
system("ps -aux")
#log dosyasi indexi
i = 0
# cpu % si ardisik iki okumada bu degerin üzerinde ise process sonlandirilir
olum = 1
# log dosyalari icin yazim araligi (sn olarak)
logla = 2
# cpu calisma kontrolu icin okuma araligi (sn olarak)
kont_zaman = 7
#loglama threadi basliyor
t1= Thread.new { loop {
sleep logla
# calisan süreclere ait butun bilgiler log dosyasina yaziliyor
system("ps aux > process#{i}.log")
# log dosyasi indexi arttiriliyor
i += 1
}
}
# kontrol threadi baslatiliyor
t2= Thread.new { loop {
# ilk okunan process id
pid1 = 0
# ikinci okunan process id
pid2 = 0
# ilk okunan cpu yuzdesi
cpu1 = 0
#ikinci okunan cpu yuzdesi
cpu2 = 0
h1 = []
h2 = []
kontrol = []

sleep kont_zaman
# her son okunan ve bir onceki process log dosyalarından pid ve cpu bilgileri alinarak
# gecici.txt adli dosyaya yaziliyor
system("awk '{ if( NR !=1 ) printf \"%d %f \", $2, $3 } { if( NR !=1 ) printf \"%d %f \\n\", $2, $3 }' process#{i}.log process#{i-1}.log > gecici.txt" )

#gecici.txt dosyasinin herbir satiri line degiskenine ataniyor
File.foreach("gecici.txt") { |line|
sayac = 0
# satir kelimelere bolunuyor
line.split.each { |kelime|
# herbir kelime uygun degiskene ataniyor

case sayac
when 0
pid1 = kelime.to_i
when 1
cpu1 = kelime.to_i
when 2
pid2 = kelime.to_i
when 3
cpu2 = kelime.to_i

end
sayac += 1


}
#atanan degiskenler 2 ayri dizide toplaniyor
h1[pid1] = cpu1
h2[pid2] = cpu2

}
pidx = 0
sayac1 = 0
#birinci okumadan gelen butun surecler taraniyor
while (pidx < 65536)
#birinci okumada olum sinirinin uzerinde oldugu saptanan
#surecler kontrol dizisine atiliyor
if (h1[pidx] != nil && h1[pidx] > olum)
kontrol[sayac1] = pidx
sayac1 +=1
end
pidx += 1

end


#ikinci okumadan gelen butun surecler taraniyor
pidy = 0
while (pidy < 65536)

# ikinci okumadan gelen süreclerin olum sinirinin
# uzerinde olup olmadigi kontrol ediliyor.
if ( h2[pidy] != nil )
if ( h2[pidy] > olum )
#Eger uzerinde ise birinci okumadan gen surec id leri ile karsilastiriliyor
kontrol.each {|kont|

if (pidy.to_i == kont.to_i)
# sureci gercekten oldurmek icin system("kill -9 pidy") satirini aktive edin
puts pidy.to_s + " olecek"
#system("kill -9 pidy")
end
}
end
end
pidy += 1
end

}
}

#threadler baslatiliyor
t1.join
t2.join

end

# ana program cagiriliyor
anaProgram

Hiç yorum yok: