LANGUAGE TRANSLATE

English French German Spain Italian Dutch Russian Portuguese Japanese Korean Arabic Chinese Simplified

kabuk etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
kabuk etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Şubat 2012 Salı

KABUK PROGRAMLAMA


Kabuk Programlamaya Giriş

Her kabuğun kendine özgü programlama dili yapısı vardır. Bash kabuğu ise güçlü programlama özellikleriyle karmaşık programların rahatça yazılmasına izin verir. Mantıksal operatörler, döngüler , değişkenler ve modern programlama dillerinde bulunan pek çok özellik bash kabuğunda da vardır ve işleyiş tarzları da hemen hemen aynıdır.
Genellikle, bir programı oluşturacak olan komutlar bir dosyaya yazılırlar ve ardından bu dosya çalıştırılır. Herhangi bir editör yardımıyla yazılan program, daha sonra kabuk altında çalıştırılır. Bir kabuk programı diğerlerini çalıştırabilir. Bu düzende kabuk programlarını daha karmaşık komutların biraraya gelmiş ve yapısallaşmış haline benzetebiliriz.
Bash'in en büyük dezavantajı, derlenerek çalıştırılan dillere göre (C, C++ gibi) daha yavaş olması, sistem kaynaklarını biraz daha fazla tüketmesidir.

Kabuk Programları

Kabuk programları, bir veya birden fazla Linux komutunu tutan dosyalardır. Bu dosya yaratıldıktan sonra doğrudan dosyanın ismi girilerek veya dosya isminden önce '.' karakteri getirerek çalıştırılabilir. Bir kabuk programı, çalıştırma bitini 1 yapmak suretiyle "çalıştırılabilir" hale getirilir. chmod komutu yardımıyla bir programı çalıştırılabilir yapmak için ,
$ chmod +x komut-ismi
yazılabilir. Bundan sonra programın ismi yazılıp enter tuşuna basıldığı zaman bir program Linux komutuymuş gibi çalışacaktır.

$ cat calistir
echo -n "Tarih : "
date
$ chmod +x calistir
$ calistir
Tarih : Sun Dec 8 07:11:51 EET 1996
Yukarıdaki örnekte "calistir" isimli iki satırlık bir kabuk programının önce içeriği ekrana yazıldı, ardından çalıştırılacak duruma getirildi ve çalıştırıldı.
Kabuk programları yazarken dosyanın işlevini ve her satırdaki komutun veya komut kümesinin ne amaçla kullanıldığını gösteren açıklama satırları kullanmak işe yarar. Bir açıklama eklemek için satır başına (veya boş satıra) # işareti eklenir ve ardından istenilen cümle girilir. # işaretinden sonraki tüm satır kabuk tarafından gözardı edilir. Aşağıdaki programda komut öncesinde yeralan açıklama satırı, komut hakkında bilgi veriyor.
# gunzip komutu dosya acmak icin kullanilir.
gunzip sistem.gz
Yorum satırı, komutun sonuna da eklenebilir.
ps -aux # sistem surecleri hakkinda ayrintili bilgi..
Bir kabuk altında çalışırken başka bir kabuk için yazılmış bir programı çalıştırmak mümkündür. Örneğin tcsh altındasınız ve daha evvel bash kullanarak yazdığınız bir programı çalıştırmak istiyorsunuz. Önce bash yazarak kabuk değiştirmeli, ardından programı çalıştırmalı, ve tekrar tcsh'a dönmelisiniz. Tüm bunları otomatik olarak yaptırabilirsiniz. Programın en başına #! karakterini, ardından programın çalışacağı kabuğun patikasını yazın. Örneğin #!/bin/bash komutunu programın en üstüne eklerseniz bu program bash kabuğu altında çalışacaktır.

Değişkenlerin Kullanımı

Bir değişkene değer atandığı anda sistem tarafından tanınır. Değişkenler alfabetik veya nümerik karakterlerden oluşabilirler fakat bir değişken sayısal bir değer ile başlayamaz. Bunların dışında değişken isminin içinde "_" karakteri de bulunabilir. Bir değişkene değer ataması "=" işareti yardımıyla yapılır.
$ mesaj="aksama yemege geliyorum"
İçeriği olan bir değişkene başına "$" işareti konularak ulaşılır. Aşağıda, echo komutu yardımıyla bir değişkenin içeriği ekrana basılıyor.
$ echo $mesaj
aksama yemege geliyorum
$ echo yarin $mesaj
yarin aksama yemege geliyorum
Aynı mesajı değişken kullanmadan da görüntüleyebiliriz.
$ echo "Aksama yemege geliyorum"
Aksama yemege geliyorum

Giriş/Çıkış İşlemleri

Bir kabuk programı çalışırken kullanıcıdan klavye yardımıyla bilgi girmesi sağlanabilir. Bu tür işlemler için tanımlanan read komutu klavyeyi okur ve aldığı bilgiyi bir değişkene atar. Aşağıdaki komutları içeren program yardımıyla klavyeden okunan değer ekrana yazılıyor. echo komutundan sonra birden fazla değişken grubu veya hem değişken, hem de dizi kullanılabilir.
echo Bir sayi giriniz..
read sayi
echo Girilen sayi : $sayi
Bazı durumlarda girilen değer özel karakterleri içerebilir. Bu durumda istenmeyen bazı sonuçların doğması kaçınılmaz olur. Aşağıdaki örneği bir dosya içine yazın ve dosyayı çalıştırdıktan sonra "*" tuşuna basın.
echo Bir karakter giriniz
read a
echo Girdiginiz karakter : $a
echo komutundan gelecek bir yıldız işareti, bulunduğunuz dizindeki tüm dosyaları listeleyecektir.

Aritmetik İşlemler

bash kabuğunda matematiksel işlemlere büyük sınırlamalar getirilmiştir. Tamsayı değişkeni dışında matematiksel değişken kullanmak için bu işlemler için geliştirilmiş ve kolaylıklar sağlayan awk veya bc kullanabilirsiniz.
Aritmetik işlemler için eval komutunu veya bash kabuğu altında yerleşik (builtin) komut olan let komutunu kullanabilirsiniz. Aşağıda let komutunun kullanımı görülüyor.
$ let "degisken=aritmetik islem"
Bu örnekte iki sayı çarpılıp çıkan sonuç başka bir değişkene yazılıyor.
$ let "carpim=2*7"
$ echo $carpim
Aritmetik değişken tanımlamanın diğer bir yolu da typeset  komutu kullanmaktır.
$ typeset -i sonuc (sonuc degiskeni bir dogal sayi icerecek)
$ a=100 ; b=56 (iki komutu ayirmak icin ; kullanilabilir)
$ sonuc=a*b
$ echo $sonuc
5600
Normal olarak bash, kesirli ve noktalı işlemleri yapamaz. Bunun için bc kullanabilirsiniz. Bc, çok yüksek duyarlılığa sahip bir hesap makinasıdır.
$ a=3.749
$ b=22.34
$ echo “$a*$b” | bc
83.752

if-else Kalıbı ve Kontrol İşlemleri

Hemen her programlama dilinde olan if kalıbı bir Linux komutunun çalışmasını kontrol (test) eder. if komutu yerleşik bir komuttur. if komutunun ardından gelen Linux komutu çalıştırılır ve komutun çıkış durumu (exit status) gözönüne alınarak ardından gelen then deyimiyle birlikte devamı işletilir. Genellikle komutun iki türlü çıkış durumu olacağından else komutunun ardından gelen komut zinciri, diğer çıkış durumunda çalıştırılır. Her if, bir fi komutuyla bitmelidir. Aşağıda if-then-else komutunun örnek sözdizimi görülüyor.


if linux komutu
then
komut1
komut2
...
else
komut1
komut2
...
fi
if komutu genellikle kendine test komutu ile birlikte kullanım bulur. Bu komut yardımıyla mantıksal işlemler yapılabilir, sayılar ve hatta diziler karşılaştırılabilir. Anahtar sözcük olan test'ten sonra opsiyonlar ve/veya karşılaştırılacak olan değerler yazılır. Her opsiyon bir mantıksal işleme karşılık gelir. Örneğin -lt opsiyonu ilk girilen aritmetik değişkenin ikinci değerden küçük olup olmadığını denetler. Benzer şekilde = opsiyonu da iki karakter kümesinin eşitliğini kontrol eder. Aşağıda test komutunun örnek kullanımı yeralıyor.
$ test 5 -eq 3
$ a="linux"
$ test $a="linux"
komutun işletilmesinin ardından kabuğa bir değer döndürülür. Bu değer komut başarılı olarak işletilmişse 0, değilse 1'dir. Son çalıştırılan tüm Linux komutlarının çıkış değeri $? değişkeninde tutulur. test komutunun çıkış değeri de bu yolla öğrenilebilir.
$ sayi=4
$ test $sayi -eq 4
$ echo $?
0
$ test $sayi -lt 2
$ echo $?
1
test komutu yerine parantezler de kullanılabilir. Yukarıdaki iki örnek, parantez kullanılarak şu şekilde yazılabilir:
$ [ $sayi -eq 4 ]
$ [ $sayi -lt 12 ]
Dikkat edilmesi gereken bir nokta, köşeli parantez kullanırken araya boşlukların eklenmesidir. Parantezler başlı başına bir komut olarak görüldüklerinden sağında ve solunda en az bir boşluk bırakılmalıdır. test komutunda sıkça kullanılan diğer seçenekler şunlardır:
Aritmetik karşılaştırma 

-gt
büyük
-lt
küçük
-ge
büyük eşit
-le
küçük eşit
-eq
eşit
-ne
eşit değil
Dizisel karşılaştırma 

-z
boş dizi
-n
tanımlı dizi
=
eşit diziler
!=
farklı diziler
Dosya karşılaştırması 

-f
dosya var
-s
dosya boş değil
-r
dosya okunabilir
-w
dosyaya yazılabilir
-x
çalıştırılabilir dosya
-h
sembolik bağlantı
-c
karakter aygıt
-b
blok aygıt
Mantıksal karşılaştırma 

-a
VE
-o
VEYA
!
DEĞİL
if komutunun test ile birlikte kullanılabildiğini daha önce belirtmiştik. Aşağıda bununla ilgili küçük bir örnek yeralıyor.
#!/bin/bash
echo "0 ile 20 arasinda bir sayi secin"
read sec
if [ $sec -lt 10 ]
then
echo "Secilen sayi tek basamakli"
else
echo "Secilen sayi cift basamakli"
fi
Her if komutu bir fi ile son bulmalıdır.

case Kalıbı

Birkaç alternatif arasından seçim yapmak için kullanılan bir komut olan case, bir eşleştirme gördüğü anda belirli bir komut kümesini işleme sokar. case yapısı case komutu ile başlar, eşleştirilecek olan anahtar sözcük yazılır ve seçenekler alt alta, her seçeneğe ait olan komutlarla birlikte belirtilir. Tüm yapı esac komutu ile son bulur.



case anahtar-sozcuk in
secenek1)
komutlar
;;
secenek2)
komutlar
;;
*)
komutlar
;;
esac
Seçenekler arasında özel karakterler (*, [, ], ? gibi) kullanılabilir. Hiçbir eşleme yapılmadığı zaman *) seçeneği değerlendirilecek ve buna bağlı olan komutlar işletilecektir. * kullanımı isteğe bağlıdır. Aşağıda case komutuna ilişkin kısa bir örnek veriliyor.
#!/bin/bash

clear
echo "1. ekrani temizle"
echo "2. sistemdekileri goruntule"
echo "3. dizindeki dosyalari goster"

echo -n "Secenegi giriniz : "
read secenek

case $secenek in
1)
clear
;;
2)
w
;;
3)
ls -al
;;
*)
echo Hatali secenek
esac

Döngüler

Diğer hemen tüm programlama dillerinin en büyük gücü olan döngü işlemlerine kabuk altında da izin veriliyor. Burada programcı tarafından en çok kullanılan 2 döngü tipi anlatılacaktır: while ve for. while komutu her döngüde bir denetleme mekanizmasını harekete geçirirken for döngüsü bir listenin elemanlarını sırayla seçer.

while-do Döngüsü

Döngü bloğu while anahtar kelimesiyle başlar, ardından gelen koşul sağlandığı sürece döngü işletilir. Önce koşulun sağlanıp sağlanmadığına bakılır. Döngüden çıkabilmek için mutlaka döngü içindeki koşul ifadesinin değerini yanlış yapacak bir durum oluşmalıdır, aksi halde sonsuz döngü oluşur.
while kosul ifadesi
do
komutlar
done
if komutuyla birlikte kullanılan test komutu, while döngüsünde koşul ifadesi olarak da yer alabilir. Aşağıda 1'den 100'e kadar sayan ve ekrana basan bir döngü görülüyor.
#!/bin/bash
deger=0
while [ $deger -lt 100 ]
do
deger=$((deger+1))
echo $deger
done
Yukarıda kullanılan (( ve )) karakterleri arasına matematiksel bir işlem getirilebilir. Bu özellik bash kabuğuna özgüdür.

for-do döngüsü

Bir liste dahilindeki tüm değerlere sırayla erişimi sağlar. for komutundan sonra yeralan liste sırayla kullanılır ve herbirisi için döngü çalıştırılır. Listenin sonuna gelindiğinde ise döngüden çıkılır.
for degisken1 in deger1 deger2 ... degerX
do
komutlar
done
Aşağıdaki örnek bu döngüyü kullanarak ekrana bir dizi kelime yazıyor. Döngü boyunca akasya, elma ve visne kelimeleri "agac" değişkenine kopyalanıyor ve her döngüde bu değişkenin içerdiği bilgiler ekrana yazılıyor.
for agac in akasya elma visne
do
echo $agac
done
for-do döngüsü, dosya isimleri üzerinde yapılan işlemlerde de büyük kolaylıklar sağlar. Bunun için özel karakterlerden yararlanmak da olasıdır. Örnek olarak * karakteri o anki çalışma dizini içindeki tüm dosyaları seçer.
for a in * ; do
file $a
done

Örnek Kabuk Programı

Sistem görevlisinin en çok kullandığım komutlardan birisi
ps -aux grep -i xxx
komutudur. Bu satır yardımıyla çalışan xxx isimli program hakkında daha detaylı bilgi elde edilebilir. ps komutu detaylı bir süreç listesini ekrana verirken çıktı doğrudan grep komutuna yönlendirilir ve sadece istediğimiz bilgi ekranda görünür. Fakat her zaman aynı uzun satırı tekrar tekrar yazmaktansa bu satırı bir dosyaya gönderip, dosya adını komut satırından çalıştırmak zamandan tasarruf sağlayacaktır. Biz de öyle yapalım ve aşağıdaki satırları ``goster'' isimli dosyaya yazalım.
#!/bin/bash
if [ $# = 1 ]
then
ps -ax | grep -i $1
else
ps -ax
fi
Ardından dosyayı PATH değişkeninin işaret ettiği dizinlerden
/usr/local/bin
altına yerleştirip çalıştırılabilir olması için
chmod  +x /usr/local/bin/goster
komutunu uygulayın. Kendi yazdığınız dosyaları
/usr/local
veya
~/bin
dizini altına kopyalamanız bunların derli toplu olarak tek bir dizinde her an erişilebilir şekilde durmaları açısından önem taşır.
Dosyaya biraz daha yakından bakalım. İlk satır, bu dosyanın /bin/bash programı tarafından çalıştırılacağını gösterir. İkinci satır yardımıyla komut satırı üzerinde kaç tane opsiyon olduğu bulunur. $# çevresel değişkeni her biri TAB veya boşluk karakteri ile ayrılmış komut satırı opsiyonları sayısını verir. Aşağıdaki komutta toplam 3 opsiyon vardır.
$ ls --8bit -F -b
$# komutuna benzer şekilde $1, $2, $3 ... değişkenleri de opsiyonları verir. Yukarıdaki komutta $1, $2, $2 değişkenleri sırasıyla

--8bit
-F
-b
değerlerini alırlar. Komut satırından çalıştırılan komut ise $0 değişkenine atılır. Yukarıdaki örnekte $0 değişkeni ls değerini tutacaktır.
goster dosyasına tek opsiyon yollayacağız. Bu opsiyon da hakkında detaylı bilgi alacağımız süreç olacaktır. Dosya içinde $1 değişkenini ps komutuna yerleştirmek için :
ps -ax | grep -i $1;
yazılır. Bundan sonra komut satırında, örneğin:
$ goster bash
girilirse $1 değişkeni bash e eşit olacak ve bu da
ps -ax grep -i bash
eşdeğer komutunu çalıştıracaktır. Komut olarak sadece goster girilirse $# değişkeni 0'a eşit olacağından dosyada yeralan ve hiç bir filtreleme yapmayan
ps -ax
komutu çalışır. 
ALINTIDIR.
KAYNAK:www.belgeler.org

25 Şubat 2012 Cumartesi

KABUK İŞLEMLERİ


Yönlendirme
Kullanıcı, ekrana yazdığı bir komutun neler yaptığını en rahat şekilde komut tarafından ekrana yönlendirilen bilgilerden anlayabilir. Program, kullanıcıyı bilgilendirme amacıyla gerek ve yeter miktarda bilgiyi ekrana vermelidir.
  Standart Girdi, Çıktı ve Hata
 Linux işletim sisteminde çalıştırılan her komut 3 dosya işaretçisine sahiptir : 
  • Standart Giriş (stdin) : Çalışan programın , dosya gibi ek kaynaklar açmadan veri okumak için kullanacağı kaynağı belirtir. Varsayılan olarak veri girişi klavyeden okuma şeklinde gerçekleştirir.
  • Standart Çıkış (stdout) : Çalışan programın çıktılarını göndereceği kaynağı belirtir. Varsayılan kaynak terminal penceresidir.
  • Standart Hata (stderr) : Çalışan programın hata çıktılarını göndereceği kaynağı belirtir. Varsayılan kaynak terminal penceresidir.
Her dosya işaretçisi bir numara ile belirtilir. Standart giriş 0 , standart çıkış 1 , standart hata 2 değerlerine sahiptir.

Standart Girişin Yönlendirilmesi

Komut çalıştığında veri girişinin belli bir dosyadan yapılması istendiğinde “ < “ karakteri ile bir dosya standart girişe yönlendirilebilir.

Linux'ta, programın ekrana yazılan bilgiyi iki sınıf altında toplayabiliriz. Birincisi, olağandışı bir durumu bildiren standart hata, diğeri de her türlü verinin yazıldığı standart çıktı. Program çalıştığı andan itibaren bu iki kanal üzerinden akan bilgiler, programın çalıştığı sanal terminale yazılırlar. Program girdilerini ise standart girdi aracı olan klavyeden alır.
Eğer bu bilgiler bir ekran boyundan (normalde 25 satır) fazla tutuyorsa bazı satırlar programcının gözünden kaçabilir. Bunu önlemek amacıyla standart çıktı ve hata bir dosyaya yazılacak şekilde ayarlanabilir. Yönlendirme olarak da bilinen bu işlem UNIX altında (DOS'ta olduğu gibi) > karakteri ile gerçekleştirilir.
Örnek olarak o an bulunduğunuz dizinde yeralan dosyaları ekrana getirin :
$ ls -al
Bu komut, standart çıktı olarak dosyaların bilgilerini ekrana getirecektir. Bu çıktıyı, bir dosyaya yönlendirelim ve dosyanın içeriğine göz atalım:
$ ls -al > liste
$ cat liste
total 16
drwxr-xr-x 5 gorkem users 1024 Feb 13 13:10 .
drwxr-xr-x 4 root root 1024 Jan 7 1980 ..
-rw-r--r-- 1 gorkem users 390 Feb 13 12:56 .Xdefaults
-rw-r--r-- 1 gorkem ftpadm 2016 Feb 13 13:09 .bash_history
-rw-r--r-- 1 gorkem users 1 Feb 13 12:57 .bashrc
-rw-r--r-- 1 gorkem users 163 Nov 24 1993 .kermrc
-rw-r--r-- 1 gorkem users 34 Nov 24 1993 .less
-rw-r--r-- 1 gorkem users 114 Nov 24 1993 .lessrc
drwxr-xr-x 2 gorkem users 1024 Jan 7 1980 .term
-rw-r--r-- 1 gorkem users 87 Feb 13 12:56 .xinitrc
-rw-r--r-- 1 gorkem users 2795 Feb 13 13:06 adres
-rw-r--r-- 1 gorkem users 0 Feb 13 13:10 liste
drwxr-xr-x 2 gorkem users 1024 Feb 13 12:54 mail
drwxr-xr-x 2 gorkem users 1024 Feb 13 12:54 perl
-rw-r--r-- 1 gorkem users 0 Feb 13 13:10 typescript
$
Standart Çıkış ve Standart Hatanın Yönlendirilmesi
> karakteri standart hatayı dosyaya yönlendirmez. Bu işlem için 2> kullanılır.
Yönlendirme için temel kullanım şekli aşağıdaki gibidir : 
komut [n]>dosya 
n sayısı hangi dosya işaretçisinin yönlendirileceğini belirtir. Bu sayı verilmediği takdirde veya 1 olarak verildiği takdirde standart çıkış için yönlendirme yapılır. Eğer n sayısı 2 olarak verilirse standart hata için yönlendirme yapılır. 
Ama hatayı görebilmek için, hata yaratan bir komut yazmalıyız, değil mi ?
$ ls /deneme
/deneme : No such file or directory
$ ls /deneme 2> hata
$ cat hata
/deneme : No such file or directory
Standart çıktı ya da standart hatayı yönlendirirken, > işareti kullanırsanız; dosya yoksa, oluşturulur ve komutun çıktısı dosyaya yazılır. Dosya varsa, içeriği yok olur, ve komutun çıktısı dosyanın yeni içeriği olur.
Var olan bir dosyayının eski içeriğini tamamen silmek değil de komutun çıktısını dosyaya eklemek istiyorsanız >> kullanmalısınız. Bu durumda dosya varsa komutun çıktısı dosyanın eski içeriği korunarak sonuna eklenir, dosya yoksa oluşturulur ve komutun çıktısı dosyaya yazılır. Örneğin:
$ echo deneme1 >>deneme.txt
$ cat deneme.txt
deneme1
$ echo deneme2 >>deneme.txt
$ cat deneme.txt
deneme1
deneme2
$
Örnekte görüldüğü gibi ilk komut deneme.txt dosyasını oluşturdu. İkincisi ise oluşan dosyanın içeriğini koruyarak ikinci komutun çıktısını bu dosyanın sonuna ekliyor. 
 Bir Komutun Çıktısını Başka Bir Komutun Verisi Olarak Kullanmak Boru (pipe)

Bazı durumlarda, bir komutun çıktısı diğer bir komuta yönlendirilebilir. Başka bir deyişle, komutun standart çıktısını bir dosyaya değil, bu çıktıyı işleyecek başka bir komuta yönlendirmek istiyorsunuz. Bu amaçla UNIX altında (yine DOS'ta olduğu gibi) boru “|” karakteri kullanılır.
Komut1 | komut2
Bu karakter, kendinden önce gelen komut veya komut serisinin çıktısını, kendinden sonra gelen komuta gönderir. Örneğin bir dizinde yeralan tüm detaylı dosya bilgilerini yazıcıya aktarmak için,

$ ls -al | lpr
komutları kullanılabilir. Artık ls -al komutunun ekrana vermesi gereken tüm bilgiler, lpr komutu aracılığıyla yazıcıya gönderilmiştir. İlk komutun standart çıktısı, ikinci komuta standart girdi olarak atanır.
Aşağıdaki komut rapor adı verilen dosyanın içeriğini wc –l komutuna yönlendiriyor. Bu komutun çıktısı ise satırsayısı.txt dosyasına yazılıyor. Böylece ekranda görmeyi beklediğiniz tüm veriler yönlendirme karakteri yardımı ile satırsayısı.txt dosyasına yerleştiriliyor.
$ cat rapor.txt | wc –l > satırsayısı.txt
Unix boruları sayesinde bir önceki komutun çıktısı üzerinde işlem yapabilen komutlar kullanılabilmektedir. Bu kullanım şekli en çok grep, wc, sort gibi filtre programları tarafından terçih edilmektedir.


wc Komutu


Bir dosyadaki byte , kelime ve satırları saymak için wc komutu kullanılır. Bu komutun temel yapısı aşağıdaki gibidir :
wc [seçenekler] [dosya]
 İşlenecek dosya verilmediği takdirde wc komutu verileri standart girişten okuyacağını varsaymaktadır. Bu sayede wc komutu Unix boruları ile bir önceki komutun çıktısını alıp işleyebilmektedir.
 wc komutu ile kullanılanabilecek temel seçenekler aşağıdaki gibidir :
  • -c : Dosyadaki byteları sayar.
  • -l : Dosyadaki satırları sayar.
  • -w : Dosyadaki kelimeleri sayar.
  • -L : Dosya içindeki en uzun satırın boyutunu gösterir.
[tufan@atlas kurs_ornek]$ cat wc_ornek
wc icin ornek
123
en uzun satir bu ve boyu 27 

[tufan@atlas kurs_ornek]$ ls -l wc_ornek
-rw-r--r-- 1 tufan users 47 Aug 23 11:05 wc_ornek

[tufan@atlas kurs_ornek]$ cat wc_ornek | wc -c
47
[tufan@atlas kurs_ornek]$ cat wc_ornek | wc -w
11
[tufan@atlas kurs_ornek]$ cat wc_ornek | wc -l
4
[tufan@atlas kurs_ornek]$ cat wc_ornek | wc -L
27
Metin Dosyalarının İçeriklerinin Sıralanması (sort)

Metin dosyaları üzerinde sıralama işlemi sort komutu ile yapılır. Bu komut satırları verilen sıralama kriterine göre sıralar ve sonucu standart çıkışa aktarır. Komutun temel kullanım şekli aşaağıdaki gibidir : 
sort [seçenek] dosya  
Dosya ismi verilmediği takdirde veriler standart girişten okunacaktır.Sort komutu ile kullanılabilecek temel seçenekler aşağıdaki gibidir:
[tufan@seawolf tufan]$ cat sort_deneme
linux
kurs
isletim
sistem 

[tufan@seawolf tufan]$ sort sort_deneme  
isletim
kurs
linux
sistem 

Metin İçinde Arama ve Grep Komutu


Metin dosyaları arasında istenilen paternleri aramak için grep komutu kullanılmaktadır. Grep komutu dosyalar üzerinde istenilen metin parçasını arar ve bu metin parçasını içeren satırları standart çıkışa kopyalar.
Temel kullanım şekli aşağıdaki gibidir :
grep [seçenekler] patern [dosya]
Dosya ismi verilmediği takdirde verilerin standart girişten okunacağı varsayılır. Bu sayede Unix boruları kullanılarak bir komutun çıktısında istenilen bir metin parçası aranabilir. 
Grep ile kullanılan temel seçenekler aşağıdaki gibidir :  
  • -l : Metin parcasının geçtiği satırların gösterilmesi yerine metin parçasının geçtiği dosyaların isimleri gösterilir. Çoğunlukla bir dizin içinde belirli bir kelimeyi içeren dosyaların bulunması işlevinde kullanılır.
  • -c : Metin parçasının geçtiği satırların gösterilmesi yerine , metin parçasının bulunduğu satır sayısının gösterilmesini sağlar.
  • -i : Büyük – küçük harf ayrımını ortandan kaldırır.
  • -n: Bulunulan satırın dosyadaki satır numarası da gösterilir. 
    Çokgörevlilik
    UNIX'in en büyük silahlarından biri süreçlerdir. Her süreç sistemde bağımsız çalışan, birbirini etkilemeyen ve herbiri kendi kaynağını kullanan programdır. Süreçler arkaplanda veya kabuğun kontrolünde çalışabilir. Çekirdek, her sürecin kullandığı sistem kaynağından haberdar olur ve bu kaynakların süreçler arasında adilce paylaşılmasından Sorumludur. Bir süreç, aksi belirtilmedikçe çalıştığı süre içinde klavyeden bilgi alır ve ekrana bilgi verir.
    Kullanıcıların haberi bile olmadan çalışan süreçler, Linux makinasındaki G/Ç işlemlerini gerçekleştirebilmek için sürekli faaliyet içinde bulunurlar. Onlarca süreçten bazıları kullanıcıların sisteme girmesini sağlarken (getty) bazıları da WWW ve FTP gibi İnternet tabanlı istekleri yerine getirir (httpd, ftpd).

     Ps Aracının Kullanımı


    Çalışan programların listesini görmek için “ps” komutunu kullanabiliriz. Hiç parametre vermeden yazılırsa sadece üzerinde çalışılan kullanıcının süreçleri ekrana gelir.

    [root@localhost ~]# ps
    PID TTY TIME CMD
    7856 pts/0 00:00:00 bash
    10765 pts/0 00:00:00 ps

    Sistemde çalışan tüm süreçlerin listesini görmek için aşağıdaki komutu çalıştırmalıyız.

    [root@localhost ~]# ps -e
    PID TTY TIME CMD
    1 ? 00:00:03 init
    2 ? 00:00:00 migration/0
    3 ? 00:00:00 ksoftirqd/0
    4 ? 00:00:00 migration/1
    5 ? 00:00:00 ksoftirqd/1
    .........

    Ayrıntılı listeleme için l parametresini ekliyoruz.

    [root@localhost ~]# ps -el
    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
    4 S 0 1 0 0 76 0 - 909 - ? 00:00:00 init
    1 S 0 2 1 0 -40 - - 0 migrat ? 00:00:00 migration/0
    1 S 0 3 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0
    1 S 0 4 1 0 -40 - - 0 migrat ? 00:00:00 migration/1
    ...........

    Ebeveyn süreçleri

    [root@localhost ~]# ps -eF
    UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
    root 1 0 0 909 548 0 13:39 ? 00:00:00 init [3]
    root 2 1 0 0 0 0 13:39 ? 00:00:00 [migration/0]
    root 3 1 0 0 0 0 13:39 ? 00:00:00 [ksoftirqd/0]
    root 4 1 0 0 0 1 13:39 ? 00:00:00 [migration/1]

    Bsd stilinde süreçlerin tümünü listelemek için ise

    [root@localhost ~]# ps ax
    PID TTY STAT TIME COMMAND
    1 ? S 0:00 init [3]
    2 ? S 0:00 [migration/0]
    3 ? SN 0:00 [ksoftirqd/0]

    Bsd stilinde süreçlerin tümünü ayrıntılı listelemek için ise

    [root@localhost ~]# ps aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0,0 3636 548 ? S 13:39 0:00 init [3]
    root 2 0.0 0.0 0 0 ? S 13:39 0:00 [migration/0]
    root 3 0.0 0.0 0 0 ? SN 13:39 0:00 [ksoftirqd/0]

    Ebeveyn ve çocuk süreçleri hiyerarşik şekilde görüntüleyebilmek için

    [root@localhost ~]# ps -ef –forest
    UID PID PPID C STIME TTY TIME CMD
    named 3193 1 0 13:39 ? 00:00:02 /usr/sbin/named -u named
    root 3254 1 0 13:39 ? 00:00:00 /usr/sbin/smartd
    root 3272 1 0 13:39 ? 00:00:00 svscan
    root 3274 3272 0 13:39 ? 00:00:00 \_ supervise submission
    vpopmail 3302 3274 0 13:39 ? 00:00:00 | \_ /usr/bin/tcpserver -v -R
    root 3275 3272 0 13:39 ? 00:00:00 \_ supervise log
    qmaill 3299 3275 0 13:39 ? 00:00:00 | \_ /usr/bin/multilog t s100
    root 3276 3272 0 13:39 ? 00:00:00 \_ supervise send
    qmails 3310 3276 0 13:39 ? 00:00:00 | \_ qmail-send
    root 3356 3310 0 13:39 ? 00:00:00 | \_ qmail-lspawn ./Maild
    qmailr 3357 3310 0 13:39 ? 00:00:00 | \_ qmail-rspawn
    qmailq 3358 3310 0 13:39 ? 00:00:00 | \_ qmail-clean


    Bir başka araç ise pstree ‘ dir. Süreçleri ve alt süreçleri alfabetik sıra ile görümtüler.

    [root@mail ~]# pstree

    Bir kullanıcıya ait süreçlerin listesini görebilmek için (u) parametresini kullanıyoruz.

    [root@localhost ~]# ps -u hakan
    PID TTY TIME CMD
    10402 ? 00:00:00 sshd
    10403 pts/1 00:00:00 bash

    Süreçlerle birlikte işlemci ve bellek miktarlarınıda görmek istiyorsak.

    [root@localhost ~]# ps -u hakan u
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    hakan 10402 0.0 0.1 8316 1432 ? S 12:25 0:00 sshd: hakan@pts/1
    hakan 10403 0.0 0.1 5288 1400 pts/1 Ss+ 12:25 0:00 –bash

    Bir kullanıncının süreç numaraları ile birlikte ebeveyn süreç numaralarını görmek istersek , o durumda –f parametresini kullanmalıyız. PPID alanı ebeveyn süreçleri göstermektedir.

    [root@localhost ~]# ps -fu hakan
    UID PID PPID C STIME TTY TIME CMD
    hakan 10402 10356 0 12:25 ? 00:00:00 sshd: hakan@pts/1
    hakan 10403 10402 0 12:25 pts/1 00:00:00 -bash

    Ps aracının çıktılarındaki bazı parametreleri açıklayalım.

    • PID: Süreç numarası. Her sürecin farklı bir numara alması sistem tarafından düzenlenir.
    • %CPU: İşlemcinin % olarak ne kadarı süreç tarafından kullanılıyor ?
    • %MEM: % olarak hafızada kapladığı yer
    • SIZE: Programın toplam kullandığı bellek alanı (kilobyte)
    • RSS: Programın bellekte kapladığı gerçek alan. Bu değer paylaşılan sistem kütüphaneleri (shared library) nedeniyle genellikle SIZE değerinden büyüktür.
    • TTY: Sürecin çalıştırıldığı (sanal) terminal
    • STAT: Süreç o sırada ne yapıyor ?
      • S: Uyumakta, bu durum genellikle sürecin bir G/Ç işlemi (örneğin farenin hareketi ya da ağdan gelecek veriler) beklemesi sırasında olur.
      • R: Çalışabilir. Çalışabilir süreçler, gereksinim duydukları bütün sistem kaynaklarına sahip olan süreçlerdir. Çekirdek (tek işlemcili bir makinada) belirli aralıklarla bu süreçlerden sadece birini çalıştırır.
      • T: Durmuş. Bu durum sürecin kullanıcı tarafından (örneğin Control-Z tuşlarına basılarak) durdurulmasında görülür.
      • Z: Zombie. Bu tür süreçler, kendisini çalıştıran sürece (parent process) mesaj bırakamadıklarından takılmış süreçlerdir. Öldürülemezler ancak sitem kaynaklarını da kullanamazlar.
      • D: Kesilemez uykuda. Bazı G/Ç işlemleri o sırada bu işlemi yapan sürecin kesilmemesini gerektirir. Böyle durumdaki süreçleri de ilgili G/Ç işlemi bitinceye kadar öldüremezsiniz.
    • START: Sürecin çalıştığı zaman
    • COMMAND: Komut satırından girilen programın ismi
    • PPID: Ebeveyn süreç numarası. Süreçlerin bağlı olarak çalıştıkları anasürüçlerin çalışma numarasıdır.
    • VSS: Sanal bellek kullanım miktarını gösterir.
    • SIZE: Hafıza kullanım miktarı. Eğer süreç swap alanından taşınırsa gerekli hafıza alanı miktarı.
    • C: %CPU ‘e bakın


    Ps komutu ile görmek istediğimiz değerleri seçme imkanına sahibiz. Ps komutu parametrelerinden değerlerni görmek istediklerimizi virgül ile ayırarak yan yana yazıyoruz. İstediğimiz parametreye göre sıralama imkanına da sahibiz. Aşağıdaki örnekte süre süreçler hafıza kullanım miktarına göre sıralanmıştır.

    [root@mail ~]# ps -eo user,pid,ppid,%cpu,%mem,size,rss,command --sort=size
    USER PID PPID %CPU %MEM SZ RSS COMMAND
    root 2 1 0.0 0.0 0 0 [ksoftirqd/0]
    root 3 1 0.0 0.0 0 0 [events/0]
    ........

    Aşağıda çalışan proses için seçilen sutunlar, işlemci kullanımı yüzdesine göre sıralanmıştır.

    [root@mail ~]# ps -eo pid,ppid,size,rss,%cpu,stat --sort=-%cpu
    PID PPID SZ RSS %CPU STAT
    3270 3238 156440 134528 0.2 S
    11155 3260 30064 31760 0.1 S
    4257 3260 35604 37724 0.1 S

    Aşağıda yine httpd sürecine ilişkin seçilen alanların değeri görülmektedir. Dikkat edilirse –C parametresi ile süreçleri ismine göre seçebilmekteyiz.

    [root@mail ~]# ps -o pid,ppid,stat -C httpd
    PID PPID STAT
    3496 1 Ss
    3522 3496 S
    3523 3496 S
    3524 3496 S
    3525 3496 S
    3526 3496 S
    3527 3496 S
    3528 3496 S
    3529 3496 S
    29317 3496 S

    İsimler gibi süreç numaralarınıda kullanabiliriz.

    [root@mail ~]# ps -p 3154 -o pid,ppid,stat
    PID PPID STAT
    3154 1 Ssl

     Top ile süreçlerin izlenmesi


    Top aracı ps aracı ps aracının aksine, süreçleri anlık değişimleride içerecek şekilde izler.Sistem üzerinde bulunan uygulamalar, üzerlerindeki iş yüküne göre sürekli olarak kaynak taleb ederler. Sistem kaynakları, önceliklerine göre çalışan uygulamalar arasında sürekli olarak paylaştırılmaktadır. Top aracı bu anlık değişimleri sürekli olarak izleyebilmemize olanak tanır. Top aracının en temel kullanımı aşağıdaki gibidir.
    [root@localhost ~]# top

    [root@localhost ~]# top
    top - 21:00:39 up 7:21, 1 user, load average: 0.15, 0.03, 0.01
    Tasks: 131 total, 1 running, 130 sleeping, 0 stopped, 0 zombie
    Cpu(s): 1.1% us, 0.3% sy, 0.0% ni, 98.0% id, 0.5% wa, 0.0% hi, 0.0% si
    Mem: 1026120k total, 991608k used, 34512k free, 11372k buffers
    Swap: 2658748k total, 208k used, 2658540k free, 546068k cached

    PID USER PR NI %CPU TIME+ %MEM VIRT RES SHR S COMMAND
    4687 apache 15 0 10 1:42.87 2.6 61512 26m 2208 D python
    5189 apache 15 0 2 1:57.79 3.9 73520 38m 2208 S python
    1 root 16 0 0 0:00.57 0.1 3636 548 468 S init
    2 root RT 0 0 0:00.03 0.0 0 0 0 S migration/0
    ...........

    Yukarıda görüldüğü üzere sistem kaynaklarında anlık olan tüm değişmeleri izlemektedir. İlk bölümde sisteme bağlanmış olan kullanıcı sayıları ve sistem yükünü görüntüler. Hemen takib eden satırda sistemde çalışan süreç sayısı ve bu süreçlerin durumlarıyla ilgili istatistiki veriler gelir. Sonraki alanlar ise sırasıyla işlemci,hafıza ve takas alanı ile ilgili verilerdir. İkinci bölümde ise süreçler ayrıntılı olarak sütünlarda listelenir. Sütünlardaki parametrelerin büyük bir bölümü ps aracındaki ile aynıdır.

    [root@localhost ~]# top –d 10 (sonucları 10 saniyede bir günceller varsayılan değer 3 saniyedir)

    [root@localhost ~]# top –u hakan (sadece hakan kullanıcısına ait süreçleri görüntüler.)

    [root@localhost ~]# top –p 4687,5189 numaralı süreçlerin durumunu görüntüler.




     Süreçlerde Arama işlemleri


    Çalışan süreçler üzerinde değişiklikler yapabilmemiz için öncelikle o süreci hafızada bulmamız gerekir. Süreçlerin durumu hakkında bilgi almak , süreçlerin çalışma önceliklerini değiştirmek, yada süreçleri öldürmek , süreçler üzerinde yapabileceğimiz değişikliklerdendir.
    Hafızada süreçleri aramak için pgrep komutunu kullanbiliriz.

     Pgrep aracı


    [root@localhost ~]# pgrep init
    1

    Eğer süreç numarası ile birlikte süreç isminide döndürmek istiyorsak (-l) parametresini eklemeliyiz.

    [root@localhost ~]# pgrep -l named
    3193 named

    Pgrep aracını herhangi bir kullanıcıya ait olan bir süreçleri bulmak içinde kullanbiliriz.

    [root@localhost ~]# pgrep -lu root
    1 init
    2 migration/0
    3 ksoftirqd/0

    Fuser Aracı


    Süreçleri bulmak için kullanabileceğimiz bir başka araç ise fuser ‘dır. Bu araç süreçlerin işlem için açtıkları dosyaları yada TCP/IP soketlerini bulabilir. Bulduğu bu kullanımda olan dosya ve soketleri proseslere sinyaller göndererek kapatabilir. Sisteme bağlanmış olan disk bölümlerindeki açık halde bulunan dosyaları kapatmak için ideal bir araçtır. Böylelikle açık kalan bu dosyaların kapatılmasıyla disk bölümleri düzgünce sistemden çözülebilir. Aşağıdaki örnekte yedek dizinini kullanan süreçler listeleniyor.

    [root@lnx ~]# fuser -m /mnt/yedek
    /mnt/yedek: 2456c

    Diğer bir kullanım şekli ise u parametresi ile sürüç numaralarının yanısıra kullanıcıları görüntülemektir. Aşağıdaki örnekte yedek dizinini kullanan süreçlerin süreç numaralarıyla birlikte bu süreçlerin sahpleri listelenmiştir.

    [root@lnx ~]# fuser -u /mnt/yedek
    /mnt/yedek: 2456c(mehmet) 2608c(root)

    Daha ayrıntılı bir çıktı için:

    [root@lnx ~]# fuser -mauv /mnt/yedek

    USER PID ACCESS COMMAND
    /mnt/yedek: mehmet 2456 ..c.. (mehmet)bash
    root 2608 ..c.. (root)bash

    Bu dizinde açık olan süreçleri öldürmek içinse

    [root@lnx ~]# fuser -k /mnt/yedek
    /mnt/yedek: 2456c 2608c

    Komutunu kullanabiliriz . Bu komuttan sonra dizinlerdeki son duruma bir daha göz atalım. Aşağıda görüldüğü üzere bu dizini kullanan tüm süreçler ölmüştür.

    [root@lnx ~]# fuser -mauv /mnt/yedek

    USER PID ACCESS COMMAND
    /mnt/yedek:

     Ps komutunun çıktısında arama yapmak

    Ps komutunun çıktısını grep aracına yönlendirerek hafızadaki süreçlerde arama yapabiliriz. Bsd stilinde ps çıktısında arama için
    [root@mail ~]# ps aux | grep clamd
    root 3238 0.0 0.0 2132 216 ? S 05:31 0:00 supervise clamd
    clamav 3264 0.2 13.4 160780 137560 ? Sl 05:31 2:15 /usr/sbin/clamd
    qmaill 3265 0.0 0.0 2432 316 ? S 05:31 0:00 /usr/bin/multilog t s1000000 n100 /var/log/qmail/clamd
    root 30104 0.0 0.0 6432 648 pts/0 S+ 23:27 0:00 grep clamd

    diğer bir yöntem ise;

    [root@mail ~]# ps -el | grep clamd
    4 S 46 3264 3238 0 76 0 - 40195 - ? 00:02:17 clamd


     Süreçlerin arkaplanda çalıştırılması


    Herhangi bir uygulamayı terminalden yada konsoldan çalıştırdığımızda, komut satırı,komutun çalışması bitene kadar başka bir komutu girmemize izin vermez. Bunun anlamı bu komutun önplanda çalışmasıdır. Eğer komutun işini birmesini istemiyorsak , komutu çalıştırırken arkaplanda çalımasına devam etmesini söylememiz gerekmektedir. Bunun için komuttan hemen sonra bir “&” işareti eklememiz gerekmektedir.

    [root@lnx ~]# firefox &
    [1] 3549

    Parantezin içindeki bir rakamı sürecin sıra numarasıdır. Diğer rakam ise tahmin edileceği üzere süreç numarasıdır. Sürecin sıra numarasının bir olmasının anlamı sistem tarafından “İlk önce bu süreç bitirilmeye çalışıcaktır.” anlamındadır. Bir başka uygulamayı daha çalıştıralım.

    [root@lnx ~]# tsclient &
    [2] 3585

    Bu durumdada tsclient uygulaması arkaplanda çalışacak şekilde çalıştırılıyor. Süreç iş numarası 2 değerini almıştır. Arka planda çalışan süreçlerin tümünü görmek istersek jobs komutunu kullanmamız gerekir.

    [root@lnx ~]# jobs
    [1]- Running firefox &
    [2]+ Running tsclient &

    Arka planda çalışan bir komutu tekrar ön planda çalıştırmak için fg komutunu kullanıyoruz.

    [root@lnx ~]# fg %1
    Firefox

    Firefox uygulamasının süreç sıra numarası 1 dir %1 parametresi ile uygulamayı tekrar ön plana almış olduk. Ön planda çalışan bir komutu arka plana göndermeden önce o komutu durdurmamız gerekmektedir. Bu işlemi ctrl+z tuş kombinasyonu ile yapabiliriz. En son durumda firefox uygulamasını ön plana almıştık. Bu uygulamayı tekrar arka plana almak için ilk önce uygulamayı ctrl+z tuş kombinasyonu ile durduruyoruz.

    [root@lnx ~]# fg %1
    firefox
    ctrl+z
    [1]+ Stopped firefox

    Daha sonra tekrar arka planda çalıştırmaya devam etmek için bg komutunu kullanıyoruz.

    [root@lnx ~]# bg %1
    [1]+ firefox &
    Bir diğer komut ise disown komutudur. Bu komut bir kabuğa bağlı olan bir süreci o kabuğa bağımlı olmaktan kurtarır. Böylelikle kabuk ölse dahi süreç çalışmaya devam edecektir.

    [root@lnx ~]# disown %3 Süreç numarası 3 . olan işlemin kabukla bağlantısını keser.
    [root@lnx ~]# disown -a Tüm işlerin kabukla bağlantısını keser.
    [root@lnx ~]# disown -h Kabuğa bağlı olarak çalışan tüm süreçleri gönderilen HUP

    sinyalinden korur.


     Süreçlerin Sona Erdirilmesi

    Her an çalışan süreçlerden biri veya birkaçı, beklenmedik döngüye girebilir. Bunun sonucu olarak sistemin kaynaklarını, özellikle hafızayı tüketici bir duruma gelebilir. Bu tür kısır döngüye giren süreçleri bulup, eğer hayati önem taşımıyorlarsa `öldürmek' gerekir. Süreci öldürmekten kasıt, programı tamamen durdurarak sistemle ilişkisini kesmektir. Bu sayede programın hafızada kapladığı bölge serbest kalacak, çekirdek de hafıza düzenlemesini tekrar yaparak başka süreçlere daha fazla yer ayıracaktır. Bir süreci öldürmek için kill komutu kullanılır. Yukarıdaki 67 numaralı sürece ait /usr/sbin/rpc.mountd programını öldürmek için şunları yazın :
    [root@lnx ~]# kill 67

    Birçok süreç sizden bu mesajı aldıktan sonra, dosya sistemi üzerinde yarattığı geçici dosyaları, dosyalar üzerine koyduğu kilitleri temizlemek gibi yapması gereken işlemleri yaptıktan sonra çalışmasına son verecektir. Eğer öldürmeye çalıştığınız süreç herhangi bir nedenle takılmışsa ve bu komuta tepki vermiyorsa aşağıdakini deneyin:

    [root@lnx ~]# kill -9 67

    Artık programın sistemle ilişkisi tamamen kesilmiştir. Kill komutu, -9 seçeneğiyle sürece 9 numaralı sinyali gönderir. Bu sinyali alan sürecin yukarıda sözü edilen iki özel durum dışında çalışmayı sürdürmesi olanaksızdır. -9 seçeneğini özellikle sistem süreçleri üzerinde gerekmedikçe kullanmamalısınız.

    Süreçleri , süreç numaralarına gerek duymadan isimleriyle öldürebilmek için killall komutu kullanılır.

    [root@lnx ~]# killall httpd

    Herhangi bir X oturumunda yanıt vermeyen bir uygulamayı öldürmek için ise xkill komutunu kullanıyoruz.

    [root@lnx ~]# xkill

    Daha sonra komutla birlikte beliren işaretçiyi takılan uygulama penceresini tıklıyoruz.
    ALINTIDIR
    KAYNAK:www.belgeler.org