Linuxta Bash ile Döngü Örnekleri

Linux / Unix işletim sisteminde shell seviyesinde döngüleri nasıl yaparım?

2,3 Parametreli bir döngü algoritmasını nasıl yazarım?

Döngü demek , aynı işlemlerin veya birbirine çok yakın işlemlerin tekrar tekrar yapılması demektir. Peki Shell seviyesinde bu işlemleri nasıl yaparız?

Ön Not : bu kodları herhangi bir dosyaya yazıp daha sonra bu dosyayı sh komutu ile çalıştırırsanız da olacaktır. Ben bu şekilde deniyorum.

For döngüsü :

yazımda numaralı çalışma şekli aşağıdaki gibidir. Döngü 5 kere dönecektir. Ayrıca döngü içinde değişkeni de kullanabilirsiniz. Normal Bash yani.

#!/bin/bash
for i in 1 2 3 4 5 .. N
do
	echo "$i inci defa calisiyor"
done

Ayrıca aşağıdaki şekilde döngüdeki değişkeni örneğin 2şer 2şer artmasını sağlayabiliyorsunuz.

#!/bin/bash
echo "Bash versiyonu ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "$i inci defa calisiyor"
 done

C stili for döngüsü :

#!/bin/bash
for (( c=1; c< =5; c++ ))
do
	echo "$c inci defa calisiyor"
done

Sonsuz Döngü :

Önemli olarak demeliyim ki ; Sonsuz döngü kullanınca sistem kaynaklarını çok basit bir komutla tüketebilirsiniz. Bu yüzden burada sleep komutu koyup işleminizi en azından saniyede 1 yapmanızda yarar var.

#!/bin/bash
for (( ; ; ))
do
   sleep 1
   echo "sonsuz dongu [ cikmak icin CTRL+C yapınız. ]"
done

Duruma bağlı döngüler, (break komutuyla birlikte )

Aşağıdaki kod, /etc/ dizinindeki tüm dosyaları okuyup bunları bir dongu halinde gezer. dogru dosyayı bulunca , istdigi islemi yapar (dosyanin icinde kaç tane nameserver varsa bunları listeler) ve donguden cıkar.

#!/bin/bash
for file in /etc/*
do
	if [ "${file}" == "/etc/resolv.conf" ]
	then
		countNameservers=$(grep -c nameserver /etc/resolv.conf)
		echo "${file} dosyasında toplam  ${countNameservers} nameserver tanimlanmis"
		break
	fi
done

break, gibi yine continue özelliğini de kullanabilirsiniz.

Ayrıca döngüde if içinde döngü yapılan klasör içindeki dosyaadı.bak dosyayı varsa bir işlem yapmak istiyorsanız veya istemiyorsanız, (örnğein yedeği varsa yedeğini alma işlemini continue edebilirsiniz) döngüde aşağıdaki if komutunu kullanabilirsiniz.

#!/bin/bash
FILES="$@"
for f in $FILES
do
        # dosyaadı .bak yedek dsoyası varsa, diğer dosyaya geç
	if [ -f ${f}.bak ]
	then
		echo "$f dosyasini atliyoruz..."
		continue  # sonraki dosyayı okuması icin cp komutunu geçiyoruz.read next file and skip cp command
	fi
        # bu noktada yedek dosyanin olmadigi durum algilandigindandosyayı kopyalamak icin cp komutu kullaniyoruz
	/bin/cp $f $f.bak
done

Ekstra olarak da farkettiğiniz gibi, bir bash dosyası içinde yorum eklemek istiyorsanız başına # koymanız da yeterli. Umarım işinize yarar.

linux sembolik link nedir linux sembolik link olusturma (symbolic link)

Sembolik bağ (symbolic link) Nedir?

İşletim sistemlerinde her dosya bir dizinin (klasörün) içindedir. Bizim dosyamız bir klasörün içinde bulunuyor ve aynı zamanda farklı bir klasörde daha olmasını istiyorsak, ama bunu yaparken dosyanın kopyalarını oluşturmak istemiyorsak, (sadece oradan da erişilebilmesini istiyorsak) dosyayı diğer klasöre kopyalamak yerine sembolik bağ (symbolic link) oluşturabiliriz. Böylece tek dosya olmuş olacak (değişiklik yapıldığında her yere tek tek kopyalamak zorunda kalmayacaksınız) hem de diğer link oluşturulan yerlerden de erişim verebilmiş olacaksınız. Disk maliyeti de daha düşük olacaktır.

Sembolik link ile klasörleri de linkleyebilirsiniz. Bu sayede bir sürü link oluşturmanız gereken durumları da sürklase etmiş olursunuz.

Linux için sembolik link oluşturma şöyle yapılır :

ln -s /dosyanin/bulundugu/dizin/dosya.txt /linkin/olusturulacagi/dizin/dosya.txt

Aynı şekilde linklemenin bir klasör için de yapabileceğinizi belirtmiştim yukarıda. Dosya adı yerine klasörü kullandığınızda da klasör için linkleme yapmış olursunuz.

Özellikle sunucularda, paket program mantığında çokça kullanabileceğiniz bu işlem ile, 200 Account olan bir serverda kaynak dosyalardan dolayı oluşan disk maliyeti 1/200 oranına azalmış olacaktır. yani %99,5 avantajlı olacaksınız. Dosya okuma hızı konusunda da avantajlı olacaksınız. Çünkü işletim sistemi (günümüz işletim sistemlerinin hemen hepsinde var bu) sürekli kullanılan dosyaları önbelleğine alacaktır. Ama siz dosya okuma konusunda daha da hız istiyorsanız, bu konuya farklı bir yazıda değineceğim. (Bu konuda bir kaç şey daha yapılabilir.)

Linux stat Komutu (command)

Linux’ta bir klasörde ls -l komutuyla görebildiğiniz dosya yetkileri, dosya sahibi, oluşturulma tarihi , vb.. gibi bilgileri tek dosya için göstermeye yarayan komuttur. Yani parametre olarak gönderilen dosya için ilgili bilgileri ekrana basan komuttur.

stat dosyaadi

şeklinde yazdığınızda ekrana bu bilgilerin hepsini yazar. Klasör listeniz genişse direkt olarak tek dosya için bu komutu kullanabilirsiniz.

Linux nohup Komutu (command) – Arka Planda Komut Çalıştırma

Çoğu zaman bir uzak sunucuya ssh üzerinden bağlanırız. Bir shell (terminal, veya kabuk artık ne diyorsanız) komutu çalıştırığınızda ve daha sonra çıkış işlemi yaptığınızda, işlem veya komut kapatılır (kill edilir). Bazı işler ise öyle 1-2 dakikada bitmez, uzun bir süre çalışması gerekir. Bu durumda, çıkmanız da gerekiyorsa, ne yapacaksınız? nohup ön komutunu kullancaksınız.

nohup komut_adi &

şeklinde bir kullanımı var.

Sonundaki ampersant işareti (&) arka planda çalışmasını sağlar. nohup ise çıkış yapıldığında kill edilmesini engeller. Yani normalde de

komut &;

şeklinde kullanıp ssh içinde gezerken arka planda bir işlem yapabilirsiniz.

  • SSH ile uzak sunucuya giriş yapın
  • bir işlem çalıştırın. örneğin nohup uzun_surecek_bir_komut &
  • CRTL + D tuşuna basarak logout olun.

Tekrar sshtan girip çalışan komutlara baktığımızda o arka planda uzun süre çalışacak komutun çalışıyor olduğunu görebiliriz. Bunun için

ps aux

yazmamız yeterli olacaktır.

Not : nohup komut önceliğini (nice değerini) değiştirmez, onu yine komutu verirken siz istiyorsanız parametre vererek yapabilirsiniz.

En Kolay Linux – Turnkey Linux

Eğer PHP ile web yazılımı geliştirmiş ve ya geliştirme altyapısını merak etmişseniz, mutlaka kendi bilgisayaranıza Ubuntu ve ya herhangi başka bir linux dağıtımı kurup Apache-MySQL-PHP kurulumları yapmayı denemişsinizdir. Bu macera kimi zaman hüsranla ve “bununla uğraşılmaz” nidalarıyla, kimi zamansa yorgun gözler ama başarmış olmanın gururu ve bilgi birikimi ile biter. Ben bir zamanlar ikisini de yaşamış ve sonunda kurulum yapmıştım 🙂

Geçen aylar içerisinde yine bir yazılım geliştirme platformu kurma ihtiyacım doğduğu için, önce kendi bilgisayarıma dual-boot ile xubuntu kurarak, LAMP (Linux Apache MySQL PHP) platformunu kurmaya başladım. Başlarda biraz zorlansam da, takıldığım noktaları eski tecrüblerimden hatırlayarak aşabildim ve Ubuntu’nun da artık daha kolaylaşmış yapısı sayesinde kurulum yapabildim. Fakat arkadaşım Arda Başoğlu‘nun beni uyarmasıyla, tekerleği tekrar keşfetme hatasına düştüğümü gördüm (bunun için kendisine ayrıca teşekkürler). İhtiyacım olan proje, benzer problemler yaşayan bazı insanların hazırladığı bir proje olan Turnkey Linux ile işte böyle tanıştım.

Turnkey Linux, belirli bir ihtiyacı karşılayan ufak linux sistemlerinden oluşuyor. Bu linux sistemlerinde, ihtiyacımız olan platform ile ilgili uygulamalar kurulmuş ve genel ayarları yapılmış şekilde bulunuyor. Ayrıca bu sistemler ister direkt kurulum için ISO formatında, ister sanallaştırma için ODF ve VMDK gibi formatlarda dağıtılıyor. Turnkey Linux projesinde kullanabileceğimiz birçok kategori ve birçok uygulama bulunuyor, örneğin web yazılım geliştirme kategorisinde LAMP, Ruby On Rails, Google App Engine gibi platformları içeren sistemler mevcut. Sadece veritabanına ihtiyaç duyuyorsanız, MySQL ve PostgreSQL veritabanı sistemlerini de indirip kullanabilirsiniz.

Örnek olarak aşağıda LAMP (Linux Apache Mysql PHP) platformunun VirtualBox ile sanal makina olarak Windows işletim sistemine sahip bir makinada kurulmasını anlattım.

Kurulum

Turnkey Linux anasayfasına girin ve Apps menüsünden Web Development kategorisinde LAMP Stack isimli uygulamayı bulun. Detaylarda indirme linklerinden More Builds(OVF) linkini tıkladıktan sonra açılan indirme ekranında ismi ovf.zip olarak biten dosyayı indirin. Bir yandan VirtualBox programının son sürümünü Windows işletim sistemi için indirip kurun.

VirtualBox kurulumun yaptıktan sonra indirilen arşiv dosyasını bir klasöre açın. VirtualBox programında File->Import Appliance diyerek Appliance Import Wizard’ı açın. Az önce arşivden çıkarttığınız dosyalardan .ovf formatındaki dosyayı bu ekranda seçin ve devam edin. Sonraki ekranda VirtualBox  bu sistem  için geçerli sanal makina ayarlarını gösterecektir. Bu ayarlardan sadece Virtual Disk Image ayarını değiştirmenizi tavsiye ederim, varsayılan olarak  C:\ diskini kullandığı için ve eğer bu diskte yeterli yeriniz yoksa sorun olabilir. Diğer ayarları değiştirmeden Import derseniz yeni sanal makina başlatmaya hazır oluyor.

Oluşan yeni sanal makinayı VirtualBox Manager ekranındaki listeden artık görebilirsiniz. Şimdi bu makinayı başlatmak ve bazı ayarlarını yapmak gerekiyor. Sanal makinayı seçtikten sonra start derseniz sanal makina açılmaya başlayacaktır. Makinamız açılırken  Turnkey Linux Hub platformu sayfasına gidin ve kayıt olun. Kayıt olmak zorunlu değil,  her bir sanal makina için dinamik DNS hizmetinden faydalanmayı sağlayacağı için kayıt olmanızı tavsiye ederim. Ayrıca eğer isterseniz sanal makinaları Amazon Elastic Cloud (EC2) sisteminde otomatik olarak yedekleme şansınız olacak. Turnkey Linux Hub platformu OpenID desteklediği için Google hesabınızla bile kayıt olabilirsiniz. Kayıt olduktan sonra giriş yaptığınızda User Profile ekranına girin, Login Details sekmesinde API Key alanını göreceksiniz. Bu bilgiyi birazdan kullanacağız.

LAMP platformunu içeren sanal makina  hazır ve root şifresini soruyor olacak. Bu şifreyi çok dikatli seçin, hem zor olsun hem de unutmayın. Sakın 123456 vermeyin 🙂 Root şifresini ssh ile shell girişi yaptığımızda da kullanacağız. Root şifresini belirledikten sonra MySQL root şifresini soracaktır. Bu şifre için de zor ama unutmayacağınız bir şifre seçin. Root kullanıcısı MySQL sisteminde her şey yetkili tek kullanıcıdır.

Bu iki şifreyi belirledikten sonra sistem az önce belirttiğimiz API Key bilgisi soracaktır. Bu bilgiyi vermek ve ya kayıt olmak zorunda değilsiniz. Eğer API Key bilgisini yazarsanız sonraki ekranda otomatik yedekleme için gerekli shell komutunu gösterecektir, fakat yedekleme sadece Amazon ile gerekli entegrasyonu hesabınızda yaparsanız sağlanıyor. Komutu gösteren ekrandan sonra, dinamik DNS hizmeti için sizden bir internet adresi isteyecektir. Burada seçeceğimiz adres {sunucumunadresi}.tklapp.com formatında olmak ve daha önce kimsenin seçmediği bir adresi olmak zorunda. Eğer bu şartları sağlıyorsa, bundan sonra internetten bu adresi yazan herhangi birisi makinanıza erişebilecektir. Üstelik IP adresiniz değişse bile, bu adres otomatik olarak sanal makina her başladığında güncellenecektir. Güncelleme yazılımının detaylarına erişmek isterseniz şu adresi kontrol edebilirsiniz.

İnternet adresi belirledikten sonra, sistem güvenlik güncellemeleri yapacağını belirtecek ve sizden onay isteyecektir. Güvenlik güncelleştirmelerini geçmeyin ve güncellemelerin bitmesini bekleyin. Güncelleştirmeler de bittiğinde karşınıza gelen ekranda sistemimizde erişebileceğimiz linkleri gösteren bir ekran gelecektir. Gördüğünüz gibi sanal makina ağda kendisini yeni bir istemci olarak göstererek  otomatik olarak farklı bir IP adresi aldı. Şu an sanal makina yerel ağdan artık erişilebilir duruma geldi. Ayrıca ekrandaki linklerde bir yönetim paneli linki de göreceksiniz, bu yönetim paneli daha önce belirlediğiniz root şifresi ile giriş kabul ediyor ve sistemin tüm ayarlarını bu görsel web arayüzü üzerinden de yapabiliyorsunuz. Oldukça rahat değil mi 🙂

Sanal makinanın  internetten de erişilebilmesi için sadece ona dinamik dns atamak yeterli değil. Ayrıca bazı router ayarları da yapmak gerekiyor. Şu adresten router markanızı bulup, 80 portunu sanal makinanın IP adresine yönlendirirseniz, internetten de erişilebilir duruma gelecektir. Dikkat edilmesi gereken başka bir nokta da, sanal makinanıza atadığınız internet adresini yerel ağınızdan denemeyin. Mesela telefonunuzdan 3G ile internet adresini açmayı deneyin. Eğer yerel ağınızdan denerseniz router sayfasına yönlenirsiniz 🙂

Bazı Turnkey Linux uygulamaları konusunda  daha detaylı yazıları ileride yazacağım.  Yeni Linux sunucunuz hayırlı olsun !