Temel Kabuk Komut Dosyalarını ve Linux Dosya Sistemi Sorunlarını Gidermeyi Anlamak ve Öğrenmek - Bölüm 10


Linux Vakfı, amacı her yerde (ve her yerde) bireylerin temelden orta seviyeye kadar sertifika almasına olanak tanımak olan yepyeni bir girişim olan LFCS sertifikasyonunu (Linux Foundation Sertifikalı Sistem Yöneticisi) başlattı. Çalışan sistemlerin ve hizmetlerin desteklenmesinin yanı sıra genel izleme ve analizin yanı sıra sorunların üst destek ekiplerine iletilmesi söz konusu olduğunda akıllı karar almayı da içeren Linux sistemleri için operasyonel destek.

Linux Temel Sertifikasyon Programına giriş konusunda size rehberlik eden aşağıdaki videoya göz atın.

Bu, mevcut 10 öğretici uzun serinin son makalesidir (Bölüm 10). Bu makalede temel kabuk komut dosyası oluşturmaya ve Linux dosya sistemlerinde sorun gidermeye odaklanacağız. LFCS sertifika sınavı için her iki konu da gereklidir.

Terminalleri ve Kabukları Anlamak

Önce birkaç kavramı açıklayalım.

  1. Kabuk, komutları alan ve çalıştırılmak üzere işletim sistemine veren bir programdır.
  2. Terminal, son kullanıcılar olarak kabukla etkileşime girmemizi sağlayan bir programdır. Bir terminal örneği, aşağıdaki resimde gösterildiği gibi GNOME terminalidir.

Bir kabuğu ilk kez başlattığımızda, bize kabuğun genellikle klavye olan standart giriş cihazından komutları kabul etmeye hazır olduğunu söyleyen bir komut istemi (komut satırı olarak da bilinir) sunar.

Bazı yararlı komutları gözden geçirmek için bu serideki başka bir makaleye (Dosyaları Oluşturmak, Düzenlemek ve Düzenlemek için Komut Kullanma - Bölüm 1) başvurmak isteyebilirsiniz.

Linux, kabuklar için bir dizi seçenek sunar; en yaygın olanları şunlardır:

bash Kabuk

Bash, Bourne Again SHell anlamına gelir ve GNU Projesinin varsayılan kabuğudur. Korn kabuğunun (ksh) ve C kabuğunun (csh) kullanışlı özelliklerini bir araya getirerek aynı anda birçok iyileştirme sunar. Bu, LFCS sertifikası kapsamındaki dağıtımlar tarafından kullanılan varsayılan kabuktur ve bu eğitimde kullanacağımız kabuktur.

sh Kabuk

Bourne SHell en eski kabuktur ve bu nedenle uzun yıllardır birçok UNIX benzeri işletim sisteminin varsayılan kabuğu olmuştur.

ksh Kabuk

Korn SHell, 1980'lerin başında David Korn tarafından Bell Laboratuarlarında geliştirilen bir Unix kabuğudur. Bourne kabuğuyla geriye dönük olarak uyumludur ve C kabuğunun birçok özelliğini içerir.

Bir kabuk betiği, kabuk tarafından birbiri ardına yürütülen komutları birleştiren yürütülebilir bir programa dönüştürülmüş bir metin dosyasından ne fazlası ne de azıdır.

Temel Kabuk Komut Dosyası Oluşturma

Daha önce de belirtildiği gibi, bir kabuk betiği düz metin dosyası olarak doğar. Böylece tercih ettiğimiz metin düzenleyiciyi kullanarak oluşturulabilir ve düzenlenebilir. Size kolaylık sağlamak için sözdizimi vurgulama özelliğine sahip vi/m (vi Düzenleyicinin Kullanımı - bu serinin 2. Bölümüne bakın) kullanmayı düşünebilirsiniz.

myscript.sh adında bir dosya oluşturmak için aşağıdaki komutu yazın ve Enter tuşuna basın.

vim myscript.sh

Bir kabuk betiğinin ilk satırı aşağıdaki gibi olmalıdır (ayrıca shebang olarak da bilinir).

#!/bin/bash

İşletim sistemine, aşağıdaki metni çalıştırmak için kullanılması gereken yorumlayıcının adını "söyler".

Artık komutlarımızı ekleme zamanı geldi. Yorumlar ekleyerek de her komutun veya betiğin tamamının amacını netleştirebiliriz. Kabuğun # pound işaretiyle başlayan satırları (açıklayıcı yorumlar) yok saydığını unutmayın.

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

Betiği yazıp kaydettikten sonra çalıştırılabilir hale getirmemiz gerekiyor.

chmod 755 myscript.sh

Betiğimizi çalıştırmadan önce ` PATH ortam değişkeni hakkında birkaç söz söylememiz gerekiyor. Eğer koşarsak,

echo $PATH

komut satırından, ` PATH: içeriğini, çalıştırılabilir bir programın adını girdiğimizde aranan, iki nokta üst üste ile ayrılmış dizinlerin listesini göreceğiz. Ortam değişkeni olarak adlandırılır çünkü kabuk ortamının bir parçasıdır; kabuk ilk başlatıldığında kabuk ve onun alt işlemleri için kullanılabilir hale gelen bir bilgi kümesidir.

Bir komut yazıp Enter tuşuna bastığımızda, kabuk ` PATH değişkeninde listelenen tüm dizinleri arar ve bulunan ilk örneği çalıştırır. Bir örnek görelim,

Aynı adda iki yürütülebilir dosya varsa, biri /usr/local/bin'de ve diğeri /usr/bin'de, ilk dizindeki dosya yürütülecektir. birincisi, diğeri dikkate alınmayacaktır.

Eğer betiğimizi ` PATH değişkeninde listelenen dizinlerden birine kaydetmemişsek, yürütülebilmesi için dosya adının sonuna ./ eklememiz gerekir. BT. Aksi takdirde, normal bir komutla yaptığımız gibi çalıştırabiliriz.

pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh

Şartlılar

Bir komutun başarısı veya başarısızlığı sonucunda, bir kabuk betiğinde gerçekleştirilecek farklı eylem planlarını belirtmeniz gerektiğinde, bu tür koşulları tanımlamak için if yapısını kullanacaksınız. Temel sözdizimi şöyledir:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Burada CONDITION aşağıdakilerden biri olabilir (burada yalnızca en sık görülen koşullar belirtilmektedir) ve şu durumlarda doğru olarak değerlendirilir:

  1. [ -a dosya ] → dosya mevcut.
  2. [ -d dosya ] → dosya mevcut ve bir dizin.
  3. [ -f dosya ] →dosya mevcut ve normal bir dosya.
  4. [ -u dosya ] →dosya mevcut ve SUID (kullanıcı kimliğini ayarla) biti ayarlı.
  5. [ -g dosya ] →dosya mevcut ve SGID biti ayarlı.
  6. [ -k dosya ] →dosya mevcut ve yapışkan biti ayarlı.
  7. [ -r dosya ] →dosya mevcut ve okunabilir.
  8. [ -s dosyası ]→ dosya mevcut ve boş değil.
  9. [ -w dosya ]→dosya mevcut ve yazılabilir.
  10. [ -x dosya ], eğer dosya mevcutsa ve çalıştırılabilirse doğrudur.
  11. [ string1=string2 ] → dizeler eşittir.
  12. [ string1 != string2 ] →dizeler eşit değil.

[ int1 op int2 ] önceki listenin parçası olmalıdır, ancak takip eden öğeler (örneğin, -eq –> eğer int1, int2'ye eşittir.) [ int1 op int2 ]'nin “çocuk” listesi olmalıdır; burada op aşağıdaki karşılaştırma operatörlerinden biridir.

  1. -eq –> eğer int1 int2'ye eşitse doğrudur.
  2. -ne –> true eğer int1 int2'ye eşit değilse.
  3. -lt –> eğer int1 int2'den küçükse doğrudur.
  4. -le –> int1 int2'den küçük veya ona eşitse doğrudur.
  5. -gt –> eğer int1 int2'den büyükse doğrudur.
  6. -ge –> int1 int2'den büyük veya ona eşitse doğrudur.

Döngüler için

Bu döngü, değerler listesindeki her değer için bir veya daha fazla komutun yürütülmesine olanak tanır. Temel sözdizimi şöyledir:

for item in SEQUENCE; do 
		COMMANDS; 
done

Burada item, her yineleme sırasında SEQUENCE'daki her değeri temsil eden genel bir değişkendir.

Döngüler sırasında

Bu döngü, kontrol komutu sıfıra eşit bir çıkış durumuyla (başarıyla) yürütüldüğü sürece bir dizi tekrarlanan komutun yürütülmesine izin verir. Temel sözdizimi şöyledir:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Burada EVALUATION_COMMAND, başarılı (0) veya başarısız (0 dışında) durumuyla çıkabilen herhangi bir komut(lar) olabilir ve EXECUTE_COMMANDS olabilir diğer iç içe geçmiş döngüler de dahil olmak üzere herhangi bir program, komut dosyası veya kabuk yapısı olabilir.

Hepsini bir araya koy

Aşağıdaki örnekle if yapısının ve for döngüsünün kullanımını göstereceğiz.

Systemd tabanlı bir dağıtımda bir hizmetin çalışıp çalışmadığını belirleme

Bir bakışta izlemek istediğimiz hizmetlerin listesini içeren bir dosya oluşturalım.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Kabuk betiğimiz şöyle görünmelidir.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

Scriptin nasıl çalıştığını açıklayalım.

1). for döngüsü, myservices.txt dosyasını LIST'in bir elemanını teker teker okur. Bu tek öğe, service adlı genel değişkenle gösterilir. LIST çıktısıyla doldurulur,

cat myservices.txt

2). Yukarıdaki komut, yineleyeceğimiz LIST'i doldurmak için değerlendirilmesi gerektiğini belirtmek üzere parantez içine alınmış ve önüne bir dolar işareti eklenmiştir.

3). LIST'in her öğesi için (hizmet değişkeninin her örneği anlamına gelir), aşağıdaki komut yürütülecektir.

systemctl status $service | grep --quiet "running"

Bu sefer genel değişkenimizin (LIST'teki her bir öğeyi temsil eden) başına bir değişken olduğunu belirtmek için bir dolar işareti koymamız gerekiyor ve bu nedenle her yinelemede değeri kullanılmalıdır. Çıktı daha sonra grep'e aktarılır.

–quiet bayrağı, grep'in, çalışıyor kelimesinin geçtiği satırları ekranda görüntülemesini önlemek için kullanılır. Bu gerçekleştiğinde, yukarıdaki komut 0 çıkış durumunu döndürür (if yapısında $? ile temsil edilir), böylece hizmetin çalıştığını doğrular.

0'dan farklı bir çıkış durumu (systemctl status $service çıktısında çalışan kelimenin bulunmadığı anlamına gelir) hizmetin çalışmadığını gösterir. koşma.

Bir adım daha ileri gidebilir ve for döngüsüne girmeyi denemeden önce myservices.txt dosyasının varlığını kontrol edebiliriz.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi
Yanıt istatistikleri için bir dizi ağ veya internet ana bilgisayarına ping gönderme

Bir metin dosyasında ana bilgisayarların bir listesini tutmak ve ara sıra bunların pinglenebilir olup olmadıklarını belirlemek için bir komut dosyası kullanmak isteyebilirsiniz (myhosts içeriğini değiştirmekten çekinmeyin ve kendiniz deneyin ).

Yerleşik okuma kabuğu komutu, while döngüsüne myhosts'u satır satır okumasını söyler ve her satırın içeriğini, daha sonra ping komutuna aktarılan değişken ana bilgisayara atar.

#!/bin/bash

This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

Ayrıca Okuyun:

  1. Kabuk Komut Dosyasını Öğrenin: Yeni Başlayanlardan Sistem Yöneticisine Bir Kılavuz
  2. Kabuk Programlamayı Öğrenmek için 5 Kabuk Komut Dosyası

Dosya Sistemi Sorunlarını Giderme

Linux çok kararlı bir işletim sistemi olmasına rağmen, herhangi bir nedenle (örneğin, elektrik kesintisi nedeniyle) çökerse, dosya sistemlerinizden birinin (veya daha fazlasının) bağlantısı düzgün şekilde kesilmeyecek ve bu nedenle Linux çalıştırıldığında hatalara karşı otomatik olarak kontrol edilecektir. yeniden başlatılır.

Ek olarak, sistem normal bir önyükleme sırasında her önyükleme yaptığında, dosya sistemlerini bağlamadan önce her zaman bütünlüğünü kontrol eder. Her iki durumda da bu, fsck (“dosya sistemi kontrolü”) adlı bir araç kullanılarak gerçekleştirilir.

fsck yalnızca dosya sistemlerinin bütünlüğünü kontrol etmekle kalmayacak, aynı zamanda talimat verildiği takdirde bozuk dosya sistemlerini onarmaya da çalışacaktır. Hasarın ciddiyetine bağlı olarak fsck başarılı olabilir veya olmayabilir; bu gerçekleştiğinde, dosyaların kurtarılan kısımları, her dosya sisteminin kökünde bulunan kayıp+bulundu dizinine yerleştirilir.

Son fakat bir o kadar da önemli olarak, işletim sistemi hala USB sürücüsünü yazmaya devam ederken bir USB sürücüyü çıkarmaya çalıştığımızda da tutarsızlıkların meydana gelebileceğini ve hatta donanımın zarar görmesine neden olabileceğini unutmamalıyız.

Fsck'in temel sözdizimi aşağıdaki gibidir:

fsck [options] filesystem
Dosya sisteminde hatalar olup olmadığını kontrol etme ve otomatik olarak onarmaya çalışma

Bir dosya sistemini fsck ile kontrol etmek için önce bağlantısını kesmemiz gerekir.

mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1

-y bayrağının yanı sıra, dosya sistemlerini hiçbir soru sormadan otomatik olarak onarmak ve dosya sistemi temiz görünse bile kontrolü zorlamak için -a seçeneğini kullanabiliriz.

fsck -af /dev/sdg1

Yalnızca sorunun ne olduğunu bulmak istiyorsak (şimdilik herhangi bir şeyi düzeltmeye çalışmadan), fsck'i -n seçeneğiyle çalıştırabiliriz; bu, dosya sistemi sorunlarını standart çıktıya çıkarır.

fsck -n /dev/sdg1

Fsck çıktısındaki hata mesajlarına bağlı olarak sorunu kendimiz mi çözmeye çalışacağımızı yoksa donanım üzerinde daha fazla kontrol yapmaları için sorunu mühendislik ekiplerine iletebileceğimizi bileceğiz.

Özet

LFCS sınavını geçmek için gereken temel alan yeterliliklerini ele almaya çalıştığımız bu 10 makalelik serinin sonuna geldik.

Belli nedenlerden dolayı, bu konuların her yönünü tek bir eğitimde ele almak mümkün değildir ve bu nedenle bu makalelerin, yeni şeyler denemek ve öğrenmeye devam etmek için sizi doğru yola soktuğunu umuyoruz.

Sorularınız veya yorumlarınız varsa her zaman memnuniyetle karşılanırız; bu nedenle aşağıdaki formu kullanarak bize yazmaktan çekinmeyin!