terminalde çalışan programları sınırlandırma

Başlatan zeusmaster, 21 Aralık 2011 - 00:08:56

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

zeusmaster

Şunu merak ettim arkadaşlar :)
Örneğin "octopus"adı verilen bir programımız var.Bu program bazı bilimsel hesaplar yapıyor.Genelde birden fazla octopus açıyorum.Acaba bu programın çalışmasına bir sınır konulabilirmi?
Örneğin ben sınır olarak "aynı anda 10 adet octopus" çalışabilir desem.Hesaplanması için octopus'ları açsam.(100 fatklı octopus açmak) benim planım ve 10 sınır olduğu için 11.den sonrakileri bekletse,önceden başlattıklarımdan herhangi biri biterse onun yerine 1 tane daha başlatsın istiyorum.Acaba nasıl yaparım  :D
Up and Running...

heartsmagic

Zor soru :)

Bunun için bash kullanılabilir belki ama onunla bir betik yazmak sanırım işin en kolay yeridir. Arka planda sürekli octopus çalışıyor mu diye dinleyen bir servis gerekebilir bu iş için. Gerçi böyle yapmadan da belki mesele kotarılır. Örneğin her octopus komutunda arka planda çalışanlar hesaplanıp eğer 10 değilse çalıştırılır, 10'sa bekletilir.

Bash ile ellerini kirletenlerle bir muhasebe yapılabilir :)
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

eribol

Octopus'un çalışma mantığı da önemli. 10 tane çalışıyor ama sistem hepsini octopus olarak görüyorsa onu nasıl kontrol edeceğiz? Bu işi harici bir kaynağın yapması teferruatlı iş, ancak octopus madem böyle bir program, kendisi çalışan octopusları sınırlandırabilir gibi :)

zeusmaster

Alıntı yapılan: eribol - 21 Aralık 2011 - 14:22:54
Octopus'un çalışma mantığı da önemli. 10 tane çalışıyor ama sistem hepsini octopus olarak görüyorsa onu nasıl kontrol edeceğiz? Bu işi harici bir kaynağın yapması teferruatlı iş, ancak octopus madem böyle bir program, kendisi çalışan octopusları sınırlandırabilir gibi :)
Hocam octopusun çalışma mantığı şöyle;
Hesapları yapılabilmesi için terminalden bir kalsörün içine giriş yapılıyor.Girmiş olduğumuz klasörün içinde info adlı ve csv uzantılı bir dosya olması gerekiyor.Sonradan octopus komutu ile o klasörde hesaplar yapılmaya başlanıyor.
Up and Running...

travego0403

@bahdem
@eribolun bahsetiği programın arkaplanda nasıl çalıştığı ile alakalı sanırsam. Şöyle düşün Windows ortamında normal şartlar altında bir tane Messenger kullanılabilmesi gibi.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

hitokiri

Alıntı yapılan: bahdem - 21 Aralık 2011 - 00:08:56
Şunu merak ettim arkadaşlar :)
Örneğin "octopus"adı verilen bir programımız var.Bu program bazı bilimsel hesaplar yapıyor.Genelde birden fazla octopus açıyorum.Acaba bu programın çalışmasına bir sınır konulabilirmi?
Örneğin ben sınır olarak "aynı anda 10 adet octopus" çalışabilir desem.Hesaplanması için octopus'ları açsam.(100 fatklı octopus açmak) benim planım ve 10 sınır olduğu için 11.den sonrakileri bekletse,önceden başlattıklarımdan herhangi biri biterse onun yerine 1 tane daha başlatsın istiyorum.Acaba nasıl yaparım  :D

Programı bilemiyorum ama şu şekilde olabilir gibi geldi bana ;
while true
do
        if  [ "`ps aux|grep 'zenity'   -c`"  -lt "11" ];then
                zenity --info &                       
        fi
done

Burada program yerine zenity'i kullandım , bu betik arkada çalıştığı sürece açık uygulama veya çalışan komut sayısını belirtilen sayıya  tamamlıyabilir gibi görünüyor.

sem

#6
Octopus'u uçbirimden

./octopus olarak değil de bir ŞEY'in içinden başlatınız =) Bu ŞEY öyle bir ŞEY olsun ki;

hitokirinin verdiği şekilde "ps aux" ya da "ps e " komutları ile octopus'u tarıyor olsun. Bu ŞEY'in içerisinde bir kuyruk yapısı bulunsun (FIFO).... 10. octopus çağrısından sonra, çağrıları bu kuyrukta depolayın. Daha sonra sayı 10'dan düşük oldukça kuyruktan alarak octopusları çalıştırsın... Burada önemli olan aslında şu

while true
do
...
done


bu ifadede ... arasına koyduğunuz şey çok fazla işlemci yiyecek demektir. Çünkü hiç durmadan kontrol yapılacaktır.  üç nokta olarak belirlenen lojik hiç ama hiç durmadan çalışacaktır...

Bu gibi durumlarda bir "timeout" belirlemek iyi bir çözüm olabilir fakat işi önemine göre bir sinyal mekanizması geliştirmek çok daha uygun bir çözüm olabilir. Şöyle ki;


while true
do
...
sleep(10)
done

gibi değil de (çünkü octopus 3 saniye işini bitiryor da olabilir ya da her ne kadar timeout koyulursa yarısı kadar sürede işlemini bitiriyor olabilir.)


* Octopusları çalıştır ve uyu
   - Yeni bir octopus çalıştırma komutu gelirse;
       *** Octopus sayısı 10 dan fazla ise ya da eşitse kuyruğa at tekrar uyu
       *** Octopus sayısı 1o dan azsa çalışanlara ekle
   - Bir octopustan ben işimi bitirdim komutu gelirse kuyruğu yokla
     *** Kuyrukta bekleyen varsa çalıştır ve uyu
     *** Kuyrukta bekleyen yoksa uyu

gibi...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

eribol

İyi ama programın ps aux ile çıktısı tek oluyor ise ne olacak? Misal chromium her sekme ve her pencere için bir proces(işlem) üretiyor ama firefox hepsini tek proces altında birleştiriyor. Octopus tam olarak nasıl çalışıyor bilmeden proces sayısını yazdırmak zahmetli olur. Kaldı ki tek sorun bu da olmaz. Octopus dizinin içine girdiğinde nasıl bir yol izliyor? Her işlem "ps aux" için bir işlem mi yoksa hepsini kendi alt süreci olarak işletiyor mu? Sonuçta burada her bir işlem için yeni bir octopus çağrısı yapılmıyorda olabilir, octopus sadece kendi içinde bir fonksiyonda çağırıyor olabilir.

Eğer octopus'u elle kontrol etme imkanı varsa o zaman bir script ile octopus çağrılabilir ancak bu defa da çağırırken "ps aux" yerine scriptin kendisi bir değişken belirleyip işletmeli. Bunu ya dosyadan okumalı ya da bir süreç olarak sürekli bellekte tutmalı(bu durumda da sürekli çalışır halde olacağından bellek tüketir).

sem

Önerdiğim sistemde ps aux çıktısı iptal edilerek de işleme devam edilebilir aslında... @eribol, dediğiniz gibi işlemler içsel olarak bir şekilde ya da fork vs bir şekilde çatallanıp o şekilde hallediliyor da olabilir.

Fakat tüm çağrılar bir merkezden yapılacağı için sadece bir kuyruk yapısı da bu işlem için yeterli olacaktır. Kuyruk yapısında ihtiyaç duyulan pop işlevi, add işelevi (insert'e şimdilik gerek yok gibi) ve kuyruk sayısını tutan bir integer... Böyle bir kuyruğun bellekte tutulması özellikle bilgisayar için hiç bir sıkıntı olşturmayacaktır... Mobil ya da gömülü sistem olsa bir nevi fakat bu sistemlerde dahi bu bahsettiğim kuyruktan kat kat fazlası işlem görebilmekte... Android tarafında hashler, listler, stackler, queue'ler bitmapler havada uçuşuyor =)

O nedenle bir kuyruk ile halledilebilecek bu uygulama da hatta çok ufak bir servis de diyebiliriz, bellek sıkıntı olmayacaktır. Ama uyruk yapısı dışında uygulamanın kendisi de bellekte duracak, uygulamanın kaplayacağı (overhead deniliyordu sanırım) bu mecburi alandan kar edip bellekte işlem yapmak için belki mesaj kuyrukları kullanılabilir. Çünkü yanlış anımsamıyorsam paylaşılan bellek (shared memory) ya da mesaj kuyrukları bilgisayar yeniden başlamadan ya da uygulama içerisinden müdahale edilmediği sürece bellekte kalmaya devam ediyordu...

Bu da sıkıntı olacak olursa pek ala dosyadan okuma yoluna gidilebilir. hali hazırda diske erişim olduğu takdirde sinyal mekanizmasını da bir dosyaya yazılmasını beklemek olarak kurgulayabilirsiniz bu durumda... "X dosyasına bir process bir şey yazarsa bir Octopus görevi sonlanmıştır" gibi...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

eribol

Programın kendisi add, inster vs gibi işlemler için dışarıdan müdahaleye izin verecek diye bir kaide yok. Müdahale edilse dahi(yani kuyruğa eklemeyi yapabilsek dahi) kuyruk bilgilerine(yani kaç işlem var, kaçıncısını ekledik) gibi verilere program ortam hazırlamamışsa ulaşılamayabilir.

Alıntı YapAndroid tarafında hashler, listler, stackler, queue'ler bitmapler havada uçuşuyor =)
Uçuşuyor, uçması da gerekir. Uçmasa uygulama yapacak adam bulamaz :) Bu nedenle uygulama geliştirmek isteyenlere kapıları açıyor.

sem

Alıntı yapılan: eribol - 21 Aralık 2011 - 21:33:21
Programın kendisi add, inster vs gibi işlemler için dışarıdan müdahaleye izin verecek diye bir kaide yok. Müdahale edilse dahi(yani kuyruğa eklemeyi yapabilsek dahi) kuyruk bilgilerine(yani kaç işlem var, kaçıncısını ekledik) gibi verilere program ortam hazırlamamışsa ulaşılamayabilir.

Aslında tam olarak anlamadım. Burada müdahaleye izin vermeyecek olan program Octopus mu bizim yazacağımız uygulama mı? Çünkü benim bu işlemleri yapacağını düşündüğüm uygulama kendi yazacağımız uygulama/servis. O nedenle dışarıdan müdahaleye izin vermeme gibi bir şansı yok.

Şöyle düşünelim, bir servisimiz/uygulamamız var; bu servis içerisinde bir kuyruk yapısı var ve çalıştırdığımız octopus uygulamasının sayısını tutacak ve kendisi çalıştırıyor olacak.

Servis'i başlattık... O kadar ilerletmişiz ki işi =);

sudo service SERVIS start

şeklinde başlattık =)

Servisimiz sinyal mekanizması için biryeri dinliyor, bir dosya, bir soket, bir sinyal vs... Örneğin soket olsun... Yerel soketler ile çalışalım; 50000. portu dinliyorum servis ile...

Octopus'u çalıştırması için SERVIS'e durumu bildiren uygulamam çalışıyor;

50000. porta de ki; Octopus'u X dizininde çalıştırsın...

Burada SERVIS uygulaması 50.porttan bu veriyi aldı. Duruma göre ya kuyruğa attı ya da çalıştırdı...

Bu şekilde bir tasarım ile, kuyruğu biz yönettiğimiz için uygulamanın bunlara müsade etmeme şansı olmayacak...

-----

Bir başka şekilde örnek verecek olursam, yazdığım ana uygulama yani yukarıda SERVIS olarak biraz abartarak =) bahsettiğim uygulama şöyle de olabilir;

./servis

dedim ve servisim açıldı... İzlenecek algoritma;

   - Daha önceden servis uygulamasının çalıştırılıp, çalıştırılmadığnı kontrol et.
      - Eğer çalıştırılmamışsa sen birincisin, sen çalış
      - Eğer çalıştırılmışsa yapacağın işlemi bir şekilde önceden çalıştırılına ilet
                                 -> Bir iletim örneği; gerekli bilgileri X dizinine yaz ve önceden çalıştırılmış olan servis uygulamasına sinyal gönder (örneğin SIGUSR1). Bu durumda servis uygulaması SIGUSR1        sinyalini aldığında X dizinine bakıp, yapılacak işi anlayacak şekilde programlanmalıdır...
                                 -> Ya da yine soket olabilir.


Gibi...



Alıntı yapılan: eribol - 21 Aralık 2011 - 21:33:21
Alıntı YapAndroid tarafında hashler, listler, stackler, queue'ler bitmapler havada uçuşuyor =)
Uçuşuyor, uçması da gerekir. Uçmasa uygulama yapacak adam bulamaz :) Bu nedenle uygulama geliştirmek isteyenlere kapıları açıyor.


Aynen öyle... Hele ki biraz daha zaman geçince mobil taraf sanılandan çok daha fazlasını sağlayacak diye düşünüyorum... (sanana göre de değişir tabii =))


".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

eribol

Sanırım başa döndük :) Bundan önceki yorumumu servis sayısını octopustan alınacak değere göre yazmıştım ama eğer bu değeri yazılacak olan script, program vs her ne ise o kontrol edecekse durum değişir ama yine önceki mesajlarıma geliyor mevzu :) Çalıştırma sayısını da kendisi hesaplamalı yani octopus burada devre dışı kalması lazım ki bu durumda da benim dediğim gibi ya bir portu dinleyerek sürekli çalışan bir servis olarak çalışacak(ve octopusu da çalıştıracak) ya da tüm octopusları çalıştıran bir uygulama olacak ve değişkeni ya dosyadan veya bellekten okuyacak ve tabii ki o değeri de kendisi kontrol edecek.

sem

Alıntı yapılan: eribol - 21 Aralık 2011 - 21:57:35
Sanırım başa döndük :)

=) Evet öyle oldu, ben kaçırmışım çünkü... Saatten olsa gerek, kusura bakmayın...

Alıntı yapılan: eribol - 21 Aralık 2011 - 21:10:29
Eğer octopus'u elle kontrol etme imkanı varsa o zaman bir script ile octopus çağrılabilir ancak bu defa da çağırırken "ps aux" yerine scriptin kendisi bir değişken belirleyip işletmeli. Bunu ya dosyadan okumalı ya da bir süreç olarak sürekli bellekte tutmalı(bu durumda da sürekli çalışır halde olacağından bellek tüketir).

Yani octopus'un ps aux'daki durumuna da önlem olarak ve tüm kontrolleri elde tutmak adına, octopus'da bir script ile çağrılıp, kendi belirlediği içsel bir parametre çağrılaların sayısını tutarak istenen durum elde edilebilir.

Aynen katılıyorum. =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

zeusmaster

Koyu bir muhabbet dönüyor :) Çoğunu anlamamkla birlikte sindirmeye çalışıyorum :)
Up and Running...

if

@bahdem, octopus için uç birimden kullanılabilinecek parametreler varsa onları ekleyerek yardımcı olabilirsin:)

zeusmaster

Alıntı yapılan: if - 21 Aralık 2011 - 22:53:03
@bahdem, octopus için uç birimden kullanılabilinecek parametreler varsa onları ekleyerek yardımcı olabilirsin:)

octopusu şu şekilde çalıştırıyoruz hocam.
Bir klasör açıyoruz ve içine info adli bir dosya koyuyoruz birtanede .csv uzantılı bir data dosyası.Sonra terminalden klasörün olduğu dizine gelip
octopus
komutu veriyoruz.Parametre derken anlayamadım?
Up and Running...

travego0403

Konsolda çalışan programlarda parametre dediğimiz programın isminden sonra eklediğimiz anahtar kelime veya karakterlerdir. Örneğin
ls
komutu parametresiz olarak kullanılabilir ve dizinin içeriğini listeler. Fakat
ls -l
şeklinde -l parametresi ile kullanırsak dosyaları özellikleriyle beraber listeler. Bazen yukarıdaki kullanımlara seçenek de denilebilir.Çünkü bunların kullanılması zorunlu değildir. Bir başka komut olan
mv eskiad yeniad
mv komutunun kullanımı yukarıdaki gibidir. Dosyayı yeniden adlandırır veya taşıyabilir. İşte bu parametrenin durumuna göre değişir. Ayrıca bu komut parametresiz olarak kullanılamaz.

Programlamada ise parametre olayı bir fonksiyona gerekli değişkenlerin bildirilmesi için kullanılır. Şöyleki kareAl(int) şeklinde bir fonksiyonumuz olsun. Bu fonksiyon bizim bildirdiğimiz sayının karesini alıp geriye bir değer döndürüyor olsun. Biz herhangi bir sayının veya değişkenin karesini bulmak için kareAl(2) gibi fonksiyonu çağırırız.İşte burada parantez içerisinde yazdığımız 2 sayısı bizim parametremiz oluyor.

Konuyla alakası yok ama yolu buraya düşenler parametre hakkında biraz bilgi sahibi olurlar belki. :)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

zeusmaster

Finlandiyadaki süper bilgisayarda arkadaşların çalıştırdığı script.sanırım bu script ile bir sınırlama yapılıyomuş.Anlayan arkadaş var mı ne diyor bu script :)
#!/bin/bash
#BSUB -L /bin/bash
#BSUB -J Har_input
#BSUB -e job_err
#BSUB -M 1048576
#BSUB -W 10:00
#BSUB -n 1

export OCTOPUS_SHARE=$USERAPPL/share/octopus/
srun $USERAPPL/octopus
Up and Running...

if