while ile yapıcaz ancak ufak bir örnek birde ufaktan mantını yazabilirmisiniz ? teşekkürler
crontab??
crontab da döngü yapabiliyormuyuz ?
crontab ile bir betiğinizi ya da programinizi istediğiniz zamanlarda çalıştırabilirsiniz.
tabii hic kullanmadim (: ama belgeler.org'da boyle gormustum.
her 10 saniye yi ayrı ayrı belirtmek zorundamıyım yoksa dongu varmı ?
Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 25 Haziran 2011 - 14:25:35
bu sekilde donguye sokabiliyorum
*/1 * * * * mkdir /mmm
ancak 1 dakikadan asası için olmuyor
Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 25 Haziran 2011 - 14:30:46
şöyle bir program varmı bildiğiniz
program 10 sn /dosya gibi
her 10 sn de calıstırcak gibi
Crontab kullanımı için:
http://forum.ubuntu-tr.net/index.php?topic=17693.0
http://www.faruktemur.com/?p=239
Cron, 10 saniye gibi küçük aralıklarda yetersiz kalabilir bildiğim kadarıyla, dakika bazında kullanılıyor sanırım en küçük. Bash bilmiyorum ama, şöyle bir şey önerebilirim:
run.py isimli bir dosya oluşturup şunları ekleyin:
#! /usr/bin/env python
import sys
import time
import subprocess
freq = float(sys.argv[1])
command = sys.argv[2:]
while True:
subprocess.Popen(command)
time.sleep(freq)
Çalıştırılabilme hakkı verdikten sonra; "./run.py süre komut" şeklinde çalıştırabilirsiniz.
[utdemir@utdemir-arch kekik]$ ./run.py 2 ls -l
toplam 4
-rw-r--r-- 1 utdemir users 150 Haz 25 16:05 run.py
toplam 4
-rw-r--r-- 1 utdemir users 150 Haz 25 16:05 run.py
toplam 4
-rw-r--r-- 1 utdemir users 150 Haz 25 16:05 run.py
toplam 4
-rw-r--r-- 1 utdemir users 150 Haz 25 16:05 run.py
sleep komutu bash ile de doğrudan kullanılabiliyor. Yani döngü sonuna istenilen süre kadar programı uyutmak (sleep komutu ise süreç /process tablosu dışına almak) yeterli olur gibi duruyor...
sleep olmazda içeri onu yazamam
dısardan olması lazım
utdmr sağol bakıyorum
@nefretmy ne için bunu yapmak istiyorsun belki farklı çözümleri olabilir.
utdmr tam oldu sağol program için anlamayada çalısım python calısmıslım var ama tıkandım bırakdım
gomugomuno halletim hocam
hepinize teşekürler
Python bilmiyorum hiç ,fakat anladığım kadarı ile;
freq değişkenine; 1. komut satırı argümanı (süre) atanıyor. ->>> freq = float(sys.argv[1])
command değişkenine ise 2. komut satırı argümanı atanıyor. ->>>command = sys.argv[2:]
Yani çalıştırılacak olan program/komut ve süre (periyot) alındıktan sonra, döngüden hiç çıkmayacak şekilde (while True:)
* Programı/komut yürüt
* freq kadar bekle
döngüsüne giriliyor...
Gerisi malum... =)
Ek: Alınan komutu yürütme işi boru haberleşmesi ile yapılıyor gibi duruyor... Popen fonksiyonundan anladığım kadarı ile; pipe open...
@sem0900 güzel anlatmış ama eklemek istediğim küçük bir şey var:
command = sys.argv[2:] satırında, (Python'u sevme nedenlerimden biri), orada [2:]'deki iki nokta; 2 ve sonraki bütün elemanları almak istediğimi belirtiyor, yani ayrıca bir düzenlemeye gerek yok 1'den fazla eleman içeren komutlar için.
Dediğin gibi, Popen yeni bir işlem yaratıp onu yürütmeye başlıyor ama İşlem bizim işlemden bağımsız olarak başladığı için kodu etkilemiyor, hani 10 saniyede bir komut versek, komut 5 saniye sürse, ikisinin başlaması arasında 15 saniye değil, 10 saniye oluyor, hem de scriptin kapatılması script tarafından çalıştırılmış kodu etkilemiyor :).
Ben onu hep "Process Open" gibi düşünmüştüm, ama araştırınca dediğin gibi "Pipe Open"mış :D.
Boruları kullanırken (bunun Türkçe'si gerçekten boru mu ya, çok kötü =)) süreci başlatırken değil de, yani popen da değil de, borudan okuma işlemleri blokeli oluyor sanırım. Yani eğer ki hafızam beni yanıltmıyorsa C tarafında öyleydi...
İki süreç (process) bir boruya yazdığında okunacak veri gelene kadar, okuyan süreç bloke oluyordu sanırım. Ama bu programda böyle bir işlem söz konusu değil tabii. Gerçi Linux sistem fonksiyonları ile bloke de ayarlanabiliyordu... C ile bir oyun yapmıştım bununla ilgili olarak. C bölümünde aritmetik oyun adı ile vermiştim...
Yalnız [2:] kısmı ise gerçekten çok kullanışlıymış...
Biraz daha var; C++ ve QT ile işim... Sonra Python'a gelecek sıra sanırım =)
C++da sleep de kullanabilirsiniz
while(a=b)
{
sleep(10);
komutlar;
}
Peki C++'ta bash komutlari calistirabilir miyiz?
evet system(); fonksiyonu ile yapabilirsiniz
Düzenleme:
az önce yazdığım komut dizisi 10 saniye bekler öyle çalışır.
şu şekle çevirirseniz
while(a=b)
{
system("komut");
sleep(10);
}
önce komutu çalıştırır 10 saniye bekler sonra devam eder
zenity komutunu soyle calistirabildim.
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("zenity --info");
}
Bu kodla python vs. calistirma sansim var mi?
gerci suanlik bash isimi gorecektir (:
tesekkurler
system("python script"); olarak evet
system fonksiyonuna yazacağımız komut
python dosya.py
mi olmali?
yoksa python kodlarini yazarak direkt olarak calistirabilir miyiz?
system fonksiyonuna göndereceğiniz parametre; aynı uçbirime yazdığınız şekilde olmalı...
Yani örneğin dosya.py isimi bir Python kodunuz var. buna çalışma izni verdikten sonra /iligili/dizin/dosya.py ile çalıştırabildiğiniz için;
system("/ilgili/dizi/dosya.py"); yazmanız yeterli olur...
system komutu şu durumlarda kullanmakta fayda var; çalıştırılan programın ürettiği çıktı işinize yaramıyorsa system fonksiyonu kullanılabilir.
Fakat örneğin dosya.py'nin hata döndürmesi eğer sizin için önemli ise; örneğin dosya.py şu şekilde bir hata versin;
"XXX dosyası bulunamadı"
Bu sonuca göre eğer bir işlem yapmanız gerekirse bu durumlarda system fonksiyonu kullanışlı değildir, çünkü çalıştırdığınız programın/uygulamanı/sürecin çıktısını elde edemezsiniz...
Bu nedenle Linux üzerinde C ve C++ için yüksek seviye isimli boru (pipe) kullanabilirsiniz.
utdmr'in Python ile yaptığı gibi...
Aynı şekilde C ve C++ için de popen fonksiyonu kullanılır...
Kullanıma örnek görmek için UGT'nin Kısayol Oluşturucu ve Mixer programınını inceleyebilirsiniz...
Baktim simdi ona
command degiskenini popen'e yollamis.
popen ise sys.argv ile komut satirindan arguman almasini istemis.
aslinda dediginiz popen'i bir incelemek istiyorum
hatta onun için de şöyle bir örnek buldum
char output[100];
FILE *p = popen("g++ main.cpp -o main 2>&1", "r");
if(p != NULL) {
while(fgets(output, sizeof(output), p) != NULL) {
http://www.cplusplus.com/forum/beginner/28982/
bir dokuman okuyayim yeter bana (:
fopen gibi düşünebilirsiniz popen'ı...
Açtığınız dosya içerisinde ise yürütülen komutun/uygulamanın çıktısının bulunduğunu düşünün... Diğerleri dosya ile aynı...
Örneğin ;
FILE *p = popen("ls -li", "r");
saturundan sonra p'yi; son dizin içerisinde ls -li komutunun çıktısı olan br dosya gibi düşünebilirsiniz. r denmiş yani okuma modunda açılmış... Yani bu boruya yazma yapılamaz.
Yalnız tabii dosya ile bazı teknik farklılıkları var. Öğrneğin dosya göstericisi konumunun ayarlanmasına yönelik fonksiyonlar gibi (seek içeren ya da rewind gibi...)
Dediginizi arastiracagim
bu konu icin Dosya islemeye bakmak yeterli midir?
Hayır yeterli değil...
Dosya işlemlerini biliyorsanız çok rahat edersiniz ama... Çünkü dediğim gibi okuma ve yazma dosya işlemleri ile hemen hemen aynı. Fakat bazı farklılıklar olabilir... Örneğin dosyadan 10 byte okudunuz. Sonra en baştan tekrar okumanız gerekti; dosya işlemlerindeki gibi rewind() fonksiyonu ile en başa alamazsınız.
Ben de çok fazla bilmiyorum açıkcası, çok üzerine gitmeye fırsatım olmadı... Gerektiği kadar okuyup kullanmıştım. "Nereden okudun?" derseniz Kaan Aslan'ın Unix/Linux sistem programlama kurs notlarından bakmıştım... Yanılmıyorsam kendi sitesinden indirebilirsiniz...
Baktim simdi ona da
Bolca ornek lazim ona ama.
Kapsamli bir konu.
İsimli, isimsiz gibi de farklılaşıyor kendi arasında... Dediğiniz gibi kapsamlı bir konu... Bazı işlemler için çok basit çözümler oluşturabiliyor Kısayol Oluşturucu ve Mixer'de olduğu gibi ama aslında biraz derinine inince kapsamlı... Örneğin iki süreç arasında çift taraflı haberleşme sağlanması mesela...
Neyse konuyu dağıttık hepten... Sorun çözülmüştü, ilgili etiket gelirse başlık kilitlenebilir gibi duruyor şimdilik...
Herkese kolay gelsin, utmdr'in çözümü için de ellerine sağlık diyorum =) Yarışmacı arkadaşlara başarılar diliyorum...
Bende cok tesekkur ederim aynen konuyu dagittik ama bu guzel bilgilerinizden istifade ettim.
Tesekkur ederim (:
rica ederim =)