Dosya Sistemi Hiyerarşi Standardı
Dosya Sistemi Hiyerarşi Standardı linux sistemi üzerindeki bir dizinin planlamasını belirleyen bir belgedir. D.S.H.S’ı, dağıtım-bağımsız yazılım geliştirmeyi daha basit hale getirmek için ortak bir planlama sağlamak amacıyla ortaya atılmıştır. D.S.H.S aşağıdaki dizinleri belirlemektedir. (Direk olarak D.S.H.S spesifikasyonundan alınmıştır)
/ (kök -root- dizini)
/boot (açılış yükleyiciye -boot loader- ait statik dosyalar)
/dev (aygıt dosyaları)
/etc (üzerinde çalışılan -host- makinaya ait sistem konfigürasyonu)
/lib (paylaşılan temel kütüphaneler ve çekirdek modülleri)
/mnt (bir dosya sistemini geçici olarak bağlamak için bağlantı noktası)
/opt (Sonradan eklenebilen -add-on– uygulama yazılım paketleri)
/sbin (gerekli ikili/çalışabilir -binary- sistem dosyaları)
/tmp (geçici dosyalar)
/usr (ikincil hiyerarşi)
/var (değişken bilgiler)
İki Bağımsız D.S.H.S Kategorisi:
D.S.H.S planlama belirlemesi iki bağımsız dosya kategorisi olduğu fikrini temel alır; paylaşılabilir paylaşılamaz, ve değişken – statik. Paylaşılabilir bilgi ana makinalar (hosts) tarafından paylaşılabilir. ancak paylaşılmayan bilgi verilen ana makinaya özgüdür (konfigürasyon dosyaları gibi). Değişken bilgi
düzenlenebilir ve değiştirilebilirken statik bilgi değiştirilemez (fakat bu kural sistem kurulumu ve bakımı için geçerli değildir.)
Aşağıdaki tablo, bu kategoriler içine girebilecek dizin örnekleri ile bu 4 olası kombinasyonu özetlemektedir. Yine bu tablo da D.S.H.S’den alınmıştır.
+———+—————–+————-+
| | shareable | unshareable |
+———+—————–+————-+
|static | /usr | /etc |
| | /opt | /boot |
+———+—————–+————-+
|variable | /var/mail | /var/run |
| | /var/spool/news | /var/lock|
+———+—————–+————-+
/usr dizinindeki ikincil hiyerarşi
/usr altında, root dosya sistemine çok benzeyen ikincil bir hiyerarşi göreceksiniz. Makina açıkken /usr dizinin olması gerek şart olmadığından bu dizin bir ağ üzerinde paylaşılabilir (”paylaşılabilir”) ya da bir CD-ROM içinden bağlanabilir (”statik”). Bir çok Linux kurulumunda /usr dizinin paylaşımı kullanılmasa
da root daki birincil hiyerarşi ile /usr deki ikincil hiyerarşi arasındaki farkı gözetmenin faydasını algılamak çok önemlidir.
Burada D.S.H.S’si ile ilgili söylenecekler bu kadardır. Dökümanın kendisi oldukça kolay anlaşılır olduğundan daha ayrıntılı bilgi için kullanabilirsiniz. Eğer dökümanı okursanız Linux D.S.H.S’si hakkında daha bir çok şey öğreneceğinizin kesin olduğunu söyleyebiliriz.
Dosyaları bulmak
Linux sistemleri içlerinde yüzlerce dosya barındırmaktadır. Her ne kadar bu dosyaların yerlerini kaybetmeyecek kadar usta olsanız bile, büyük bir ihtimalle bir tanesini bulmak için arasıra yardıma ihtiyaç duyacaksınız. Linux’te dosyaları bulmak için birkaç tane farklı araç yer almaktadır. Aşağıdaki konu başlıkları bu araçları göstermekte ve işiniz için gerekli olan doğru aracı bulmanıza yardımcı olmaktadır.
PATH
Bir programı komut satırında çalıştırdığınızda, kabuk aslında bir grup dizin arasında yazdığınız komutu aramaktadır. Örneğin, ls yazdığınızda, kabuk gerçekte bu komutun /usr/bin altında yer aldığını bilemez.
Onun yerine dizinlerin tutulduğu ve birbirlerinden iki nokta ile ayrıldığı PATH çevre değişkenine başvurur. PATH’in içinde yazılı olan değeri görmek için aşağıdaki gibi yazabiliriz:
$ echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin: /usr/local/sbin:/usr/local/bin:/usr/games:.
PATH değişkeninin sahip olduğu bu değere göre (sizdeki değişkenin değeri farklı olabilir, kabuk yazılan ls komutu için öncelikle /usr/local/bin daha sonra /usr/bin altında arama yapacaktır. Büyük bir ihtimalle ls /usr/bin altında yer almaktadır, bu yüzden kabuk burada komut arama işlemini bitirecektir.
PATH’i düzenlemek
Elemanlar atayarak kendi PATH değişkeninizi değiştirebilirsiniz:
$ PATH=$PATH:~/bin $ echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin: /usr/local/sbin:/usr/local/bin:/usr/games:.:/home/knoppix/bin
Ayrıca, her ne kadar mevcut olan PATH değişkenini kullanmak kadar kolay olmasa da PATH değişkeni içerisinden bazı elemanları silmeniz de mümkündür. Bunun için en iyi yol, olmasını istediğiniz yeni PATH değerinin yazmaktır:
$ PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:~/bin $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/knoppix/bin
”which” hakkında her şey
Aradığınız programın PATH ile verilen dizinlerden birinde olup olmadığını which komutu ile bulabilirsiniz.
Örneğin, aşağıdaki komut ile Linux sistemimizin sağduyuya sahip olup olmadığını sorgulayabiliriz:
$ which sagduyu
Aşağıdaki örnekte ise ls komutunun nerede bulunduğunu görebiliriz:
$ which ls /usr/bin/ls "which -a"
Son olarak -a seçeneğine dikkat etmelisiniz. Bu seçenek kullanıldığında which komutu PATH değişkeninde tanımlı tüm dizinlerde aradığınız programın olup olmadığını gösterir:
$ which -a ls /bin/ls whereis
Eğer bir programın yerini öğrenmek dışında onunla ilgili daha çok bilgiye erişmek istiyorsanız whereis komutunu denemelisiniz:
$ whereis ls ls: /bin /bin/ls /usr/share/man/man1/ls.1.gz
Buradan görürüz ki ls programı iki dizinde bulunmaktadır, /bin and /usr/bin. Buna ek olarak /usr/share/man dizininde de ls ile ilgili bir man sayfası olduğu bilgisini ediniriz. man ls yazdığınızda karşınıza gelen sayfa yukarıda belirtilen sayfadır. whereis aynı zamanda kaynak arama, alternatif arama yolları tanımlama ve sıradışı girdileri arama gibi özelliklere de sahiptir. Detaylı bilgi için lütfen whereis man sayfasını inceleyin.
find
find alet çantanızdaki araçlardan biridir. find komutu ile artık sadece program dosyaları ile sınırlı değilsiniz, her türlü dosyayı çok çeşitli kriterlere göre arayabilirsiniz. Örneğin /usr/share/doc dizini ve alt dizinlerinde README dosyasını bulmak için şu komutu vermeniz yeterlidir.
$ find /usr/share/doc -name README /usr/share/doc/aalib1/README /usr/share/doc/adduser/examples/README /usr/share/doc/afio/README
find ve joker karakterler
-name parametresine değer geçerken dosya açılımındaki (glob) joker karakterleri kullanabilirsiniz ancak bu durumda onları çift tırnak içine almanız veya önlerine ters bölü (backslash) koymanız gerekir (ki bash tarafından açılmayıp find komutuna oldukları gibi gönderilebilsinler). Örneğin uzantıya sahip README dosyalarını bulmak için şu komutu verebiliriz:
$ find /usr/share/doc -name README\* /usr/share/doc/LANG/fr/xtel/README_IMINITEL.txt.gz /usr/share/doc/a2ps/README.gz /usr/share/doc/aalib1/README
find ile küçük büyük harf ayrımı yapmadan aramak
Elbette arama yaparken büyük küçük harf ayrımı yapmak istemeyebilirsiniz:
$ find /usr/share/doc -name ’[Rr][Ee][Aa][Dd][Mm][Ee]*’
Veya daha basit olarak:
$ find /usr/share/doc -iname readme\*
Gördüğünüz gibi -iname seçeneği büyük küçük harf ayrımını ortadan kaldırır.
find ve düzenli ifadeler
Eğer düzenli ifadelere alışıksanız -regex seçeneğini kullanarak belli bir kalıpla eşleşecek şekilde dosya
isimlerini arayabilirsiniz. -iname seçeneğine benzer şekilde -iregex seçeneği ile de büyük küçük harf ayrımı
yapılmasını engelleyebilirsiniz.
find ve türler
-type seçeneği ile belli tipte dosyalar üzerinden arama yapabilirsiniz. Bu seçeneğe geçebileceğiniz argümanlar şunlardır: b (blok cihazı), c (karakter cihazı), d (dizin), p (isimlendirilmiş boru), f (normal dosya), l (sembolik bağlantı) ve s (soket). Örneğin /usr/bin dizinindeki vim sözcüğünü içeren sembolik linkleri aramak için:
$ find /usr/bin -name ’*vim*’ -type l /usr/bin/evim /usr/bin/gvim /usr/bin/gvimdiff /usr/bin/rgvim /usr/bin/rvim /usr/bin/vimdiff
find ve ‘mtime’lar
-mtime seçeneği dosyaları son güncelleme zamanlarına göre aramanızı sağlar. mtime seçeneğine verilen değer 24-saatlik zaman periyodu formatındadır ve genellikle + (verilen zamandan sonra) veya – (verilen zamandan önce) ile kullanılır. Örneğin şu senaryoya bir bakalım:
$ ls -l ? -rw------- 1 root root jan 7 18.00 a -rw------- 1 root root jan 6 18:00 b -rw------- 1 root root jan 5 18:00 c -rw------- 1 root root jan 4 18:00 d $ date Mon Jan 7 18:14:52 EST 2002
Son 24 saat içinde oluşturulmuş dosyaları arayabilirsiniz:
$ find . -name \? -mtime -1 ./a
Veya içinde bulunduğunuz 24 saatten önce oluşturulmuş dosyaları arayabilirsiniz:
$ find . -name \? -mtime +0 ./b ./c ./d
-daystart seçeneği
Eğer ek olarak -daystart seçeneğini de kullanırsanız zaman periyodları 24 saat öncesinden değil günün başlama anından başlar. Örneğin dün ve evvelki gün oluşturulmuş dosyaları listelemek için:
$ find . -name \? -daystart -mtime +0 -mtime -3 ./b ./c $ ls -l b c -rw------- 1 root root 0 Jan 6 18:00 b -rw------- 1 root root 0 Jan 5 18:00 c
-size seçeneği
-size seçeneği dosyaları büyüklük kriterine göre aramanızı sağlar. Aksi belirtilmediği sürece -size seçene ğine 512-byte’lık bloklar cinsinden büyüklük verildiği kabul edilir ancak bunun sonuna bir takı eklemek işleri kolaylaştırabilir ve daha doğal kılabilir. Kullanabileceğiniz takılar şunlardır: b (512-byte’lık blok), c (byte), k (kilobyte), ve w (2-byte’lık sözcük). Bunlara ek olarak + öneki ile verilen büyüklükten daha büyük dosyaları ve – öneki ile de daha küçük dosyaları arayabilirsiniz. Örneğin /usr/bin dizini içinde boyu 50 byte’tan küçük olan dosyaları bulmak isterseniz:
$ find /usr/bin -type f -size -50c /usr/bin/bison.yacc /usr/bin/kdvi /usr/bin/krdb /usr/bin/pydoc2.1 /usr/bin/pydoc2.2 /usr/bin/rgrep /usr/bin/texi2pdf
Bulunan dosyaların işlenmesi
Pekçok değişik kritere göre arayıp bulduğunuz onca dosya ile ne yapacağınızı merak ediyor olmalısınız! find komutu bulduğu dosyalar üzerinde işlem yapma kabiliyetine de sahiptir ve bunun için -exec seçeneğinden faydalanır. Bu seçenek argüman olarak ; ile sonlandırılan ve çalıştırılabilir bir komut alır ve her {} gördüğü-yere de bulmuş olduğu dosya ismini koyarak ilgili komutu çalıştırır. Bunun anlamanın en kolay yolu şu örneğe bakmak:
$ find /usr/bin -type f -size -50c -exec ls -l ’{}’ ’;’ -rwxr-xr-x 1 root root 29 2002-04-04 12:29 /usr/bin/bison.yacc -rwxr-xr-x 1 root root 30 2001-12-01 07:14 /usr/bin/kdvi -rwxr-xr-x 1 root root 27 2000-09-24 14:46 /usr/bin/krdb -rwxr-xr-x 1 root root 45 2002-07-29 22:39 /usr/bin/pydoc2.1 -rwxr-xr-x 1 root root 48 2002-07-29 23:19 /usr/bin/pydoc2.2 -rwxr-xr-x 1 root root 31 2001-11-28 17:36 /usr/bin/rgrep -rwxr-xr-x 1 root root 36 2002-09-07 10:08 /usr/bin/texi2pdf
Gördüğünüz gibi find komutu bir hayli güçlü bir komuttur. UNIX ve Linux’un yıllarca süren geliştirilmesi boyunca bu komut da geliştirilmiştir. find komutunun daha pek çok faydalı seçeneği vardır. İlgili man sayfasında bunları bulabilirsiniz.
Locate
Şimdiye dek which, whereis ve find komutlarını ele aldık. find çalışırken biraz vakit geçtiğini farketmişsinizdir çünkü üzerinde her dizine tek tek girip bakmak zorundadur. locate komutu ise bir veritabanını kullanarak işleri biraz hızlandırabilir. Bu komut yol isminin herhangi bir kısmı ile eşleşme yapabilir sadece dosya ismine bakmak zorunda değildir. Örneğin:
$ locate bin/ls /bin/ls /bin/lspci /sbin/lsmod /sbin/lspci /sbin/lspnp /usr/bin/lsattr /usr/bin/lsdev /usr/bin/lsof /usr/bin/lspgpot /usr/bin/lss16toppm /usr/sbin/lsof /usr/sbin/lsusb
updatedb kullanımı
Pekçok Linux sistemi periyodik olarak veritabanını güncelleyen bir süreç (process) çalıştırır. Eğer sisteminiz yukarıdaki komuta aşağıdaki gibi bir hata ile cevap verirse o zaman bir veritabanı oluşturmak için uptadedb komutunu çalıştırmanız gerekir:
$ locate bin/ls locate: /var/spool/locate/locatedb: No such file or directory $ su Password: # updatedb
updatedb komutunun işini tamamlaması uzun bir süre alabilir. Eğer gürültücü bir harddiskiniz varsa tüm dosya sistemi indekslenirken başınız epey ağrıyabilir.
slocate
Pek çok Linux dağıtımında locate komutu yerine artık slocate komutu kullanılmaktadır. Genellikle locate isimli bir sembolik bağlantı olduğu için hangisini kullanayım diye tereddüt etmenize gerek yoktur. slocate ”secure locate” yani ”güvenli locate” anlamına gelmektedir. Bu komut kullandığı veritabanında dosya ve dizin izinlerini de depolar ve böylece normal kullanıcılar erişim izninine sahip olmadıkları dizine bakamazlar. slocate komutunun kullanım şekli locate komutunda olduğu gibidir ancak çıktı bilgisi komutu çalıştıran kullanıcıya göre değişebilir.
Süreç (process) Kontrolü
xeyes’ı başlatmak
Süreç kontrolünü öğrenmek için önce bir süreç başlatalım:
$ xeyes -center red
xeyes penceresinin birden açıldığını ve kırmızı gözlerin fareyi takip ettiğini göreceksiniz. Bu arada bir şey daha farkedeceksiniz: Komut satırına dönmediğinizi.
Süreci durdurmak
Komut satırına geri dönebilmek için Control-C tuş kombinasyonuna basmalısınız (genellikle Ctrl-C veya Ĉ şeklinde gösterilir):
^C $
bash komut satırına geri döndünüz ancak xeyes penceresi de kayboldu. Aslında işi yapan süreç tamamen sonlandırılmış, öldürülmüş durumda. Control-C ile süreçi öldürmek yerine Control-Z ile durdurabilirdik:
$ xeyes -center red ^Z [1]+ Stopped $xeyes -center red
Şimdi gene bash komut satırına döndünüz ama bu sefer xeyes penceresi durması gereken yerde duruyor. Ancak fare ile oynarsanız göreceksiniz ki gözler sizi takip etmiyor artık, donup kalmış durumdalar.
Eğer xeyes penceresi üzerine başka bir pencereyi sürükleyip sonra çekerseniz göreceksiniz gözler yeniden çizilmiyor bile. Süreç hiçbir şey yapmıyor şu anda yani ”Durmuş” (Stopped) halde.
fg ve bg
Süreci ”durdurulmuş olmaktan çıkarmak” ve yeniden çalışır hale getirmek için onu bash komutlarından biri olan fg komutu ön plana çekebiliriz:
$ fg xeyes -center red ^Z [1]+ Stopped $
Şimdi de yine bir bash komutu olan bg ile süreci arkaplanda çalıştıralım:
$ bg [1]+ xeyes -center red &
Harika! xeyes süreci şu anda arkaplanda çalışıyor ve bizim de karşımıza kullanabileceğimiz bir komut satırı geldi.
“&” Kullanımı
Eğer xeyes’ı doğrudan arkaplanda çalıştırmak isteseydik (Control-Z ve sonra da bg kullanmak yerine), xeyes komutunun sonuna ”&” (ampersand) eklememiz yeterli olacaktı:
xeyes -center blue & [2] 4386
Birden çok sayıda arkaplan süreci
Şimdi arkaplanda bir kırmızı ve bir de mavi xeyes sürecimiz var. Bunları bash komutlarından biri olan jobs komutu ile listeleyebiliriz:
$ jobs -l [1]- 4205 Running xeyes -center red & [2]+ 4386 Running xeyes -center blue &
Sol sütundaki sayılar bash kabuğunun bu süreçleri başlatırken onlara atadığı süreç numaralarıdır. İki numaralı süreç (başka bir deyişle job) yanında bir + (artı) sembolü vardır ve bu da sürecin şu anda çalışmaktan olan süreç olduğunu gösterir yani fg komutunu verirseniz önplanda çalışmaya başlayacak olan süreç budur. Tabi eğer isterseniz numarasının vererek başka bir süreci de önplana çekebilirsiniz. fg 1 komutu kırmızı xeyes sürecini önplana çekecektir. Bir sonraki sütun ise süreç ID’sini yani pid numarasını gösterir karşımızdaki listede (bunun gelmesini de jobs komutuna verdiğimiz -l seçeneğine borçluyuz). Son olarak her iki süreç (job) da ”Running” yani çalışıyor durumda ve bunları başlatan komut satırlarını da en sağda görebilirsiniz.
Sinyallere giriş
Süreçleri öldürmek, durdumak ya da devam ettirmek için, Linux işletim sistemi ”sinyal” olarak bilinen özel bir iletişim şekli kullanır. Bir sürece belli bir sinyal yollayarak o süreci sonlandırabilir, durdurabilir, ya da başka şeyler yapabilirsiniz. Aslında Control-C, Control-Z, ya da fg, bg gibi komutları kullandığınızda
yaptığınız tam da budur – bash kabuğunun belli bir sürece belli bir sinyal göndermesini sağlamaktasınızdır.
Bu sinyaller kill komutuna süreç numarası (pid) verilerek de gönderilebilir:
$ kill -s SIGSTOP 4386 $ jobs -l [1]- 4205 Running xeyes -center red & [2]+ 4386 Durduruldu (sinyal) xeyes -center blue
Gördüğünüz gibi kill komutu isminin çağrıştırdığı şekilde illa ki bir süreci ”öldürmek” zorunda değildir. ”-s” seçeneği kullanılarak kill komutunun bir sürece herhangi bir sinyali göndermesi sağlanabilir. Linux süreçlerine SIGINT, SIGSTOP ya da SIGCONT sinyallerinden biri gönderildiğinde sırası ile bunları sonlandırır, durdurur ya da devam ettirir. Bir sürece yollayabileceğiniz başka sinyal türleri de vardır; bunlardan bazıları uygulamanın özelliklerine göre yorumlanacaktır. Belli bir sürecin hangi sinyale karşı nasıl tepki vereceğini öğrenmenin en güzel yolu ilgili süreci başlatan komutun man sayfasına bakıp oradaki SIGNALS bölümünü okumaktır.
SIGTERM ve SIGINT
Eğer bir süreci öldürmek (sonlandırmak) isterseniz pek çok seçeneğiniz vardır. Aksi belirtilmediği sürece kill komutu SIGTERM sinyalini gönderir ve bu Control-C ile yollanabilen SIGINT sinyalinden farklı olmakla birlikte benzer sonuç üretir:
$ kill 4205 $ jobs -l [1]- 4205 Sonlandırıldı xeyes -center red & [2]+ 4386 Durduruldu (sinyal) xeyes -center blue
Büyük ölüm
Süreçler hem SIGTERM hem de SIGINT sinyallerini dikkate almayıp görmezden gelebilirler; bunu ya bilerek ve isteyerek yaparlar ya da bir şekilde durmuş veya takılmışlardır. Bu gibi durumlarda bir balyoz kullanmak gerekebilir ve devreye SIGKILL sinyali girer. Bir süreç SIGKILL sinyalini görmezden gelemez:
$ kill 4386 $ jobs -l [2]+ 4386 Durduruldu (sinyal) xeyes -center blue $ kill -s SIGKILL 4205 $ jobs -l [2]+ 4205 Süreç durduruldu xeyes -center blue
nohup
Belli bir işi (süreci) başlattığınız terminal o işin kontrol terminali olarak adlandırılır. Bazı kabuklar öntanımlı olarak (bash değil) siz logout komutu ile terminalden çıkınca arkaplandaki işlere SIGHUP sinyalini yollayıp onların sonlanmasına yol açarlar. Eğer siz terminalden logout komutu ile çıktığınızda süreçlerinizin bu şekilde sonlandırılmasını istemiyorsanız o zaman süreci başlatırken nohup seçeneğini kullanmanızda fayda vardır:
$ nohup make & $ exit
ps komutu ile süreçleri listelemek
Yukarıda kullandığımız jobs komutu içinde bulunduğumuz mevcut bash oturumunda başlatılan süreçleri listeliyordu. Sisteminizdeki tüm süreçleri görmek için kullanmanız gereken komut ise ps komutudur ve bu komuta a ve x seçeneklerini vermeniz gereklidir.
$ ps ax PID TTY STAT TIME COMMAND 1 ? S 0:04 init 2 ? SW 0:00 [KEVENTD] 3 ? SWN 0:00 [ksoftriqd_CPU0] 4 ? SW 0:01 [kswapd] 5 ? SW 0:00 [bdflush] 6 ? SW 0:00 [kupdated]
Bu komutun çıktısı olan listenin ancak küçük bir kısmını yukarı yazdık çünkü genellikle bu liste çok daha uzun olur. Bu liste size makinanın o anda ne yaptığının bir fotoğrafını verir ancak göz atılacak pek çok veri vardır içinde. Eğer ax seçeneklerini kullanmadan ps komutunu çalıştıracak olsaydınız sadece size ait ve belli bir terminalin kontrolü altındaki süreçleri görürdünüz. ps x size tüm süreçleri gösterir, belli bir terminal tarafından kontrol edilmeyenler dahil. Eğer ps a şeklinde kullanmış olsaydınız o zaman da belli terminallere bağlı ve herkese ait süreçleri görürdünüz.
Hem ormanı hem de ağaçları görebilmek
Her süreç ile ilgili farklı bilgileri de listeleyebilirsiniz. –forest (orman) seçeneği süreç hiyerarşisini görmenizi ve sisteminizdeki birçok sürecin arasındaki ilişkiyi algılamanızı sağlar. Bir süreç başka bir süreç başlattığında bu yeni sürece ”çocuk” (child) süreç denir. –forest seçeneği kullanılarak elde edilen bir ps çıktısında ebeveyn süreçler yani çocuk süreçleri başlatan süreçler solda görünürken çocuk süreçler de sağa doğru dallanacak şekilde listelenirler.
$ ps x --forest PID TTY STAT TIME COMMAND 318 ? S 0:00 /bin/sh /etc/X11/xinit/xinitrc 444 ? S 0:00 \_ kwrapper ksmserver --restore 2932? S 0:00 kdeinit: kio_uiserver
”u” ve ”l” ps seçenekleri
”u” ve ”l” seçenekleri a ve x seçeneklerine eklenebilen seçeneklerdir ve süreçler hakkında daha çok bilgi almanızı sağlarlar:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ikaruxt 3316 1.3 0.0 22360 4848 pts/0 Ss 00:51 0:00 /bin/bash ikaruxt 3325 0.0 0.0 37320 3184 pts/0 R+ 00:51 0:00 ps au
”top” kullanımı
ikaruxt@ikaruxt:~$ top top - 01:46:09 up 7:48, 1 user, load average: 2,87, 3,26, 3,03 Tasks: 223 total, 2 running, 221 sleeping, 0 stopped, 0 zombie %Cpu(s): 19,6 us, 4,2 sy, 0,0 ni, 74,8 id, 1,3 wa, 0,0 hi, 0,1 si, 0,0 st MiB Mem : 7873,0 total, 454,6 free, 4172,9 used, 3245,5 buff/cache MiB Swap: 11264,0 total, 11238,5 free, 25,5 used. 2946,2 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 31765 ikaruxt 20 0 1636116 400608 149588 R 41,9 5,0 51:15.35 Discord 6470 root 20 0 498176 163288 139056 S 11,0 2,0 44:05.00 Xorg 7580 ikaruxt 20 0 1179168 180476 75476 S 7,3 2,2 43:06.56 deepin-wm 7755 ikaruxt 20 0 2747012 22296 18348 S 7,0 0,3 29:25.25 pulseaudio 31727 ikaruxt 20 0 530612 109692 84012 S 6,3 1,4 13:45.85 Discord 29055 ikaruxt 20 0 1006828 127640 41252 S 3,0 1,6 4:01.03 evince 31683 ikaruxt 20 0 1204160 140236 89752 S 2,7 1,7 7:19.43 Discord 3295 ikaruxt 20 0 591844 37728 25832 S 2,3 0,5 0:01.11 deepin-terminal 7650 ikaruxt 20 0 2367628 46068 26712 S 2,3 0,6 11:36.56 dde-session-dae 24141 ikaruxt 20 0 1931932 378932 122420 S 1,7 4,7 11:40.32 Web Content 7871 ikaruxt 20 0 1180348 15456 8900 S 1,0 0,2 4:53.66 deepin-sync-dae 9581 ikaruxt 20 0 1290716 60824 44100 S 1,0 0,8 3:37.79 dde-control-cen 21058 ikaruxt 20 0 9826064 734276 154232 S 1,0 9,1 40:17.61 firefox 7505 ikaruxt 20 0 49336 5408 3308 S 0,7 0,1 3:30.21 dbus-daemon 7858 ikaruxt 20 0 2120524 149092 82100 S 0,7 1,8 10:31.81 franz 8056 ikaruxt 20 0 1230712 160108 63280 S 0,7 2,0 1:43.97 franz 8111 ikaruxt 20 0 2346668 174520 61648 S 0,7 2,2 4:47.68 franz 8519 ikaruxt 20 0 182492 34280 13888 S 0,7 0,4 3:19.21 applet.py
nice
Her sürecin bir öncelik derecesi vardır ve Linux buna göre sürecin çalışma hızını ayarlar. Bir sürecin önceliğini bu sürecin isminin başına nice yazıp başlatmak suretiyle ile ayarlayabilirsiniz:
$ nice -10 xmms /cdrom/Demos/Audio/opensource.ogg
Öncelik ayarına ”nice” dendiği için buna yüksek bir değer verdiğiniz takdirde diğer süreçlere nezaket sergilediğinizi, onlara CPU için öncelik tanıdığınızı hatırlamak zor olmayacaktır. Aksi belirtilmediği sürece, süreçler 0 öncelikli olarak başlarlar, yani yukarıda ogg’nin 10 ile başlatılması demek, ogg’nin CPU’ya ne kadar ihtiyacı olursa olsun önceliği diğer süreçlere tanıması ve böylece onların normal hızda çalıştırılmasına izin vermesi demektir. Süreçlerin ”nice” derecesini ps ve top komutlarının yukarıdaki çıktılarındaki NI sütununda görebilirsiniz.
renice
Nice komutu, sadece çalıştırdığınız anda, bir komutun önceliğini belirler. Eğer çalışmakta olan bir komutun önceliğini değiştirmek isterseniz renice kullanmanız gerekir.
ikaruxt@ikaruxt:~$ ps l 6470 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 4 0 6470 6434 20 0 496948 162460 - Rsl+ tty1 44:24 /usr/lib/xorg/Xorg -background none :0 -seat seat0 -auth /var/run/light
Yazı işleme
Yönlendirme Bir komutun çıktısını bir dosyaya yönlendirmek için > operatörünü kullanırız, şöyle ki:
$ echo "dosya" > kopyasi
Çıktıyı yönlendirmeye ek olarak, oldukça güçlü bir kabuk özelliği olan pipe (boru)ları da kullanabiliriz. Bağlantıları kullanarak bir komutun çıktısını diğerine girdi olarak vermemiz mümkün. Şu örneğe bir bakın
$ echo "merhaba dunyali" | wc 1 2 16
— karakteri soldaki komutun çıktısının sağdaki komuta girdi olarak verilmesini sağlamaktadır. Yukardaki örnekte echo komutu ”merhaba dunyali” cumlesini sonunda bir satır sonu ile birlikte basar. Normalde bu çıktının terminalde gözükmesi lazım fakat yaptığımız bağlantı onu wc komutuna yönlendirdi ve böylece satır, kelime ve karakter (boşluk ve satır sonu dahil) sayılarını öğrendik. Bir boru örneği İşte bir başka örnek:
$ ls -s | sort -n
Bu durumda, ls -s normalde mevcut dizinin listesini her dosyanın boyu dosya isminden önce gelecek şekilde terminal ekranına basacakken biz bu çıktıyı borudan geçirip sort -n’ye yönlendirdiğimiz için karşımıza çıktının sayısal olarak sıralanmış şekli gelmektedir. Ev (home) dizininizdeki büyük dosyaları
bir bakışta tespit etmek için gerçekten güzel bir yöntem!
Aşağıdaki önekler biraz daha karışıktır ancak boru mekanizması ile ne kadar güçlü ve becerikli işlemler gerçekleştirilebildiğini göstermeleri bakımından faydalıdır. Şimdiye dek görmediğiniz bazı komutlarla karşılaşabilirsiniz, bunun sizi yavaşlatmasına lütfen izin vermeyin. Bunun yerine boru mekanizmasını yani bir çıktının bir sonraki programa girdi olarak nasıl geçildiğini anlamaya odaklanın. Böylece bunlardan günlük Linux kullanımınızda bolca faydalanabilirsiniz. Sıkıştırılmışları açan boru hattı Nomalde sıkıştırılmış bir dosyayı açmak ve arşivi çözmek için şunu yaparsınız:
$ bzip2 -d linux-2.4.16.tar.bz2 $ tar xvf linux-2.4.16.tar
Bu yöntemin dezavantajı diskinizde sıkıştırılmamış bir ara dosya barındımasıdır. tar yazılımı doğrudan standart girdiden okuyabildiği için (yani buna parametre olarak illa ki diskteki bir dosyayı geçmeniz gerekmediği için) yukarıdaki sonucun aynısına şöyle bir boru hattı kullanarak, daha pratik ve ekonomik bir şekilde erişebiliriz:
$ bzip2 -dc linux-2.4.16.tar.bz2 | tar xvf -
Sıkıştırılmış arşiv (tarball) dosyamız bir anda açılıverdi ve arada ortaya çıkan geçici bir dosyaya da ihtiyaç duymadık.
Cat
Bir başka örneğe bakalım:
$ cat dosyam.txt | sort | uniq | wc -l
cat komut ile myfile.txt dosyasının içeriğini elde edip bunu sort komutuna girdi olarak veriyoruz. sort komutu bu girdiyi alınca tüm satırları alfabetik olarak sıralıyor ve ürettiği çıktıyı boru üzerinden uniq komutuna aktarıyor ve bu program da tekrar eden satırları iptal ediyor (yani birbirinin aynısı olan satırlardan sadece bir tane görünüyor) ve bu sonucu wc -l komutuna veriyor. wc komutunu daha önce görmüştük, -l seçeneği ile birlikte kullanıldığında bu komut sadece ve sadece satır sayısını verir. Birkaç test dosyası oluşturup bu boru hattının etkilerini inceleyebilirsiniz.
Metin işleme kasırgası başlıyor!
Şimdi standart Linux metin işleme komutlarının üzerinden fırtına gibi geçeceğiz. Bu bölümde bir hayli yoğun bir içerik aktardığımız için her komuta dair detaylı bir sürü örnek veremeyeceğiz bu yüzden de sizden burayı okuduktan sonra ilgili komutların man sayfalarına bakmanızı istiyoruz. Bunları inceleyin ve değişik seçeneklerle oynayın, öğrenmenin en güzel yolu budur. Genel kural olarak bu komutlar kendisine verilen metin dosyalarının içeriğini uygun şekilde işleyip ekrana basarlar, dosyanın kendisine kalıcı olarak müdahale etmezler. Bu fırtına turundan sonra girdi ve çıktı yönlendirmeye biraz daha detaylı bakacağız.
echo
echo kendisine verilen argümanları terminale basar. -e seçeğini kullanırsanız ”escape dizisi” olarak tabir ettiğimiz özel karakter kombinasyonlarının da düzgün olarak yorumlanmasını sağlarsınız, misal: echo -e ”foo nfoo” komutu ekrana önce foo basar, bir satır aşağı iner başka bir deyişle yenisatır karakteri basar ve sonra yine bir kez foo basar. -n seçeneğini kullanırsanız çıktıya en sonra otomatik olarak eklenen yenisatır karakterinin basılmasını engelleyebilirsiniz.
cat, sort ve uniq
cat: cat komutu bir dosyanın içeriğini terminal ekranına basar. Bir boru hattına ilk girdiyi vermek için faydalı bir komuttur, misal cat foo.txt — vesaire — vesaire.
sort: sort komutu komut satırında kendisine belirtilen dosyanın içeriğini alfabetik olarak sıralayıp basar. Elbette sort komutu da boru üzerinden kendisine aktarılan girdiyi kabul edecek şekilde tasarlanmıştır. man sort ile bu komutun ne kadar farklı sıralama işleri için pratik şekilde kullanılabileceğini görebilirsiniz. uniq: uniq sıralanmış bir dosyayı ya da boru hattı üzerinden kendisine yollanan veriyi alır ve bunun içindeki birbirinin aynısı olan satırları ayıklar.
wc, head, ve tail
wc: wc komut satırında kendisine belirtilen dosyayı (ya da boru hattından gelen veriyi) okur ve bu dosyanın satır, sözcük ve byte sayısını ekrana basar. man wc ile detaylı bilgi edinebilirsiniz.
head: head komutu bir dosyanın ya da boru hattından gelen verinin ilk on satırını basar. -n seçeneği ile kaç satır basılacağını belirleyebilirsiniz.
tail: Bu komut bir dosyanın ya da boru hattından akan verinin son on satırını basar. -n seçeneği ile kaç satır basılacağını belirleyebilirsiniz.
tac, expand ve unexpand
tac: tac da tıpkı cat komutu gibidir, şu farkla ki okuduğunu tersten basar. Yani son okunan satır ilk olarak basılır, dosyanın ilk satırı ise en son basılır.
expand: expand komutu girdideki tab karakterlerini boşluk karakterine dönüştürür. -t seçeneği ile tab duraklarını belirleyebilirsiniz.
unexpand: unexpand girdideki boşlukları tab karakterine dönüştürür. -t seçeneği ile tab duraklarını belirleyebilirsiniz.
cut, nl ve pr
cut: cut komutu belli bir dosyadaki ya da girdideki karakterle ayrılmış alanları çekip çıkarır.
nl: nl girdideki her satırın başına sıra ile artan bir sayı ekler. Özellikle program kaynak kodu türünden dosyalara göz atarken ya da bunların çıktısını alırken faydalıdır.
pr: pr komutu bir dosyayı sayfalara böler, yazıcı çıktılarında faydalıdır.
tr, sed ve awk
tr: tr bir tür karakter dönüştürme aracıdır, girdideki belli karakterleri çıktıdaki başka karakterlere tasvir etmek için kullanılır.
sed: sed çok güçlü, veri akışını işlemeye yönelik (stream-oriented) metin editörüdür.
awk: awk kolay kullanımlı, satır tabanlı bir metin işleme dilidir.
od, split, ve fmt
od: od komutu girdiyi alıp sekizlik ya da onaltılık biçimde basar.
split: split komutu büyük bir dosyayı alıp bunu küçük dosyalara ayırır.
fmt: fmt paragraf kenarları toplanacak şekilde paragrafı yeniden biçimlendirir. Bu yetenek birçok text editör içerisinde yer alsa bile bilinmesi gereken komutlardan bir tanesidir.
Paste, join, ve tee
paste: paste iki ya da daha fazla dosyayı girdi olarak alır, giriş dosyalarından gelen ardışıl satırları birbiri ardına ekler ve sonuç satırlarını çıktı yapar. Text tabloları ve kolonları yaratmak için oldukça kullanışlıdır.
join: join de paste komutuna benzese de tek bir satırda birleşecek şeyleri eşleştirmek için, her girdi satırında bir alan kullanır.
tee: tee kendi girdisini hem dosyaya hem de ekrana basar. Bir şeyin log’unu tutmak ama aynı zamanda çıktıyı ekranda da görmek istediğinizde bu komut gayet kullanışlı olabilir
Yönlendirme (redirection)
Bash komut satırlarında kullanılan >’a benzer olarak, bir dosyayı komuta yönlendirmek için < de kullanabilirsiniz. Bir çok komuta girdi olması için komut satırlarında dosya adı belirleyebilirsiniz. Fakat bazı komutlar sadece standart girdiden alınan girişlerle çalışmaktadır.
Bash ve diğer kabuklar ”herefile” kavramına destek verirler. Bu yöntem sizin belli bir gözcü değer ile sonlanmış ve komut çağrımından sonra gelen satırlarda bir komuta girdi belirtmenize olanak sağlar.
Örneğin:
$ sort <<END > elma > armut > muz > END armut elma muz
Bu örnekte, END ile sonlanan ve girdinin bittiğini ifade eden kelimeyi ve bundan önce de elma, armut ve muz kelimelerini yazdık ve sort programı bu girdinin sıralanmış şekli ile geri döndü.
>> Kullanımı
> > kullanımının << ile benzerlik göstereceğinin düşünecek olasanız da aslında bu ikisi birbirinden farklıdır. >> basitçe çıktıyı > nin yaptığı gibi dosyaya yazmak yerine dosyanın sonuna yazar. Örneğin:
$ echo merhaba > dosyam $ echo oradakiler. > dosyam $ cat dosyam oradakiler.
O da ne! ”merhaba” kelimesini kaybettik. Aslında az önce kastettiğimiz:
$ echo merhaba > dosyam $ echo oradakiler. >> dosyam $ cat dosyam merhaba oradakiler.
idi. Bu daha iyi değil mi?
Comments