Memahami & Mempelajari Skrip Shell Dasar dan Pemecahan Masalah Sistem File Linux - Bagian 10


Linux Foundation meluncurkan sertifikasi LFCS (Linux Foundation Certified Sysadmin), sebuah inisiatif baru yang bertujuan untuk memungkinkan individu di mana pun (dan di mana pun) mendapatkan sertifikasi dalam tingkat dasar hingga menengah dukungan operasional untuk sistem Linux, yang mencakup dukungan sistem dan layanan yang berjalan, serta pemantauan dan analisis secara keseluruhan, ditambah pengambilan keputusan yang cerdas ketika menyampaikan masalah kepada tim dukungan tingkat atas.

Lihat video berikut yang memandu Anda dalam pengenalan Program Sertifikasi Linux Foundation.

Ini adalah artikel terakhir (Bagian 10) dari 10 seri panjang tutorial kali ini. Pada artikel ini kita akan fokus pada skrip shell dasar dan pemecahan masalah sistem file Linux. Kedua topik tersebut diperlukan untuk ujian sertifikasi LFCS.

Memahami Terminal dan Shell

Mari kita perjelas beberapa konsep terlebih dahulu.

  1. Shell adalah program yang mengambil perintah dan memberikannya ke sistem operasi untuk dieksekusi.
  2. Terminal adalah program yang memungkinkan kita sebagai pengguna akhir berinteraksi dengan shell. Salah satu contoh terminal adalah terminal GNOME, seperti yang ditunjukkan pada gambar di bawah.

Ketika kita pertama kali memulai sebuah shell, ia menampilkan prompt perintah (juga dikenal sebagai baris perintah), yang memberitahu kita bahwa shell siap untuk mulai menerima perintah dari perangkat input standarnya, yang biasanya berupa keyboard.

Anda mungkin ingin merujuk ke artikel lain dalam seri ini (Gunakan Perintah untuk Membuat, Mengedit, dan Memanipulasi file – Bagian 1) untuk meninjau beberapa perintah yang berguna.

Linux menyediakan berbagai opsi untuk shell, berikut ini yang paling umum:

pesta Shell

Bash adalah singkatan dari Bourne Again SHell dan merupakan shell default Proyek GNU. Ini menggabungkan fitur-fitur berguna dari Korn shell (ksh) dan C shell (csh), menawarkan beberapa peningkatan pada saat yang bersamaan. Ini adalah shell default yang digunakan oleh distribusi yang tercakup dalam sertifikasi LFCS, dan shell inilah yang akan kita gunakan dalam tutorial ini.

sh cangkang

Bourne SHell adalah shell tertua dan oleh karena itu telah menjadi shell default di banyak sistem operasi mirip UNIX selama bertahun-tahun.

ksh Shell

Korn SHell adalah shell Unix yang dikembangkan oleh David Korn di Bell Labs pada awal tahun 1980an. Ini kompatibel dengan shell Bourne dan mencakup banyak fitur dari shell C.

Skrip shell tidak lebih dan tidak kurang dari file teks yang diubah menjadi program yang dapat dieksekusi yang menggabungkan perintah yang dijalankan oleh shell satu demi satu.

Skrip Shell Dasar

Seperti disebutkan sebelumnya, skrip shell dilahirkan sebagai file teks biasa. Dengan demikian, dapat dibuat dan diedit menggunakan editor teks pilihan kami. Anda mungkin ingin mempertimbangkan untuk menggunakan vi/m (lihat Penggunaan Editor vi – Bagian 2 dari seri ini), yang menampilkan penyorotan sintaksis untuk kenyamanan Anda.

Ketik perintah berikut untuk membuat file bernama myscript.sh dan tekan Enter.

vim myscript.sh

Baris pertama skrip shell harus seperti berikut (juga dikenal sebagai shebang).

#!/bin/bash

Ini “memberi tahu ” sistem operasi nama penerjemah yang harus digunakan untuk menjalankan teks berikutnya.

Sekarang saatnya menambahkan perintah kita. Kita dapat memperjelas tujuan setiap perintah, atau keseluruhan skrip, dengan menambahkan komentar juga. Perhatikan bahwa shell mengabaikan baris-baris yang dimulai dengan tanda pagar # (komentar penjelasan).

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

Setelah skrip ditulis dan disimpan, kita perlu membuatnya dapat dieksekusi.

chmod 755 myscript.sh

Sebelum menjalankan skrip, kita perlu menyampaikan beberapa patah kata tentang variabel lingkungan ` PATH. Jika kita lari,

echo $PATH

dari baris perintah, kita akan melihat isi ` PATH: daftar direktori yang dipisahkan titik dua yang dicari ketika kita memasukkan nama program yang dapat dieksekusi. Disebut variabel lingkungan karena merupakan bagian dari lingkungan shell – sekumpulan informasi yang tersedia untuk shell dan proses turunannya saat shell pertama kali dimulai.

Saat kita mengetikkan perintah dan menekan Enter, shell mencari di semua direktori yang tercantum dalam variabel ` PATH dan mengeksekusi instance pertama yang ditemukan. Mari kita lihat contohnya,

Jika ada dua file executable dengan nama yang sama, satu di /usr/local/bin dan satu lagi di /usr/bin, maka file yang ada di direktori pertama akan dieksekusi pertama, sedangkan yang lain akan diabaikan.

Jika kita belum menyimpan skrip kita di salah satu direktori yang tercantum dalam variabel ` PATH, kita perlu menambahkan ./ ke nama file untuk mengeksekusi dia. Jika tidak, kita dapat menjalankannya seperti yang kita lakukan dengan perintah biasa.

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

Persyaratan

Kapan pun Anda perlu menentukan tindakan berbeda yang harus diambil dalam skrip shell, sebagai akibat dari keberhasilan atau kegagalan suatu perintah, Anda akan menggunakan konstruksi if untuk menentukan kondisi tersebut. Sintaks dasarnya adalah:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Dimana CONDITION dapat berupa salah satu dari berikut ini (hanya kondisi yang paling sering disebutkan di sini) dan bernilai benar jika:

  1. [ -sebuah file ] → file ada.
  2. [ -d file ] → file ada dan merupakan direktori.
  3. [ -f file ] →file ada dan merupakan file biasa.
  4. [ -u file ] →file ada dan bit SUID (set user ID)-nya disetel.
  5. [ -g file ] →file ada dan bit SGID-nya disetel.
  6. [ -k file ] →file ada dan bit lengketnya disetel.
  7. [ -r file ] →file ada dan dapat dibaca.
  8. [ -s file ]→ file ada dan tidak kosong.
  9. [ -w file ]→file ada dan dapat ditulis.
  10. [ -x file ] bernilai benar jika file ada dan dapat dieksekusi.
  11. [ string1=string2 ] → stringnya sama.
  12. [ string1 != string2 ] →stringnya tidak sama.

[ int1 op int2 ] harus menjadi bagian dari daftar sebelumnya, sedangkan item berikutnya (misalnya, -eq –> benar jika int1 sama dengan int2.) harus berupa daftar “anak-anak” dari [ int1 op int2 ] di mana op adalah salah satu operator perbandingan berikut.

  1. -eq –> bernilai benar jika int1 sama dengan int2.
  2. -ne –> benar jika int1 tidak sama dengan int2.
  3. -lt –> benar jika int1 lebih kecil dari int2.
  4. -le –> benar jika int1 lebih kecil atau sama dengan int2.
  5. -gt –> benar jika int1 lebih besar dari int2.
  6. -ge –> benar jika int1 lebih besar atau sama dengan int2.

Untuk Loop

Perulangan ini memungkinkan untuk mengeksekusi satu atau lebih perintah untuk setiap nilai dalam daftar nilai. Sintaks dasarnya adalah:

for item in SEQUENCE; do 
		COMMANDS; 
done

Dimana item adalah variabel generik yang mewakili setiap nilai dalam SEQUENCE selama setiap iterasi.

Sementara Loop

Loop ini memungkinkan untuk mengeksekusi serangkaian perintah berulang selama perintah kontrol dijalankan dengan status keluar sama dengan nol (berhasil). Sintaks dasarnya adalah:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Dimana EVALUATION_COMMAND dapat berupa perintah apa pun yang dapat keluar dengan status sukses (0) atau gagal (selain 0), dan EXECUTE_COMMANDS dapat berupa program, skrip, atau konstruksi shell apa pun, termasuk loop bersarang lainnya.

Menyatukan Semuanya

Kami akan mendemonstrasikan penggunaan konstruksi if dan perulangan for dengan contoh berikut.

Menentukan apakah suatu layanan berjalan di distro berbasis systemd

Mari buat file dengan daftar layanan yang ingin kita pantau secara sekilas.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Skrip shell kita akan terlihat seperti ini.

#!/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

Mari kita jelaskan cara kerja skripnya.

1). Perulangan for membaca file myservices.txt satu elemen LIST dalam satu waktu. Elemen tunggal tersebut dilambangkan dengan variabel generik bernama layanan. LIST diisi dengan output dari,

cat myservices.txt

2). Perintah di atas diapit tanda kurung dan diawali dengan tanda dolar untuk menunjukkan bahwa perintah tersebut harus dievaluasi untuk mengisi LIST yang akan kita ulangi.

3). Untuk setiap elemen LIST (artinya setiap instance dari variabel layanan), perintah berikut akan dijalankan.

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

Kali ini kita perlu mengawali variabel generik (yang mewakili setiap elemen dalam LIST) dengan tanda dolar untuk menunjukkan bahwa itu adalah variabel dan dengan demikian nilainya di setiap iterasi harus digunakan. Outputnya kemudian disalurkan ke grep.

Flag –quiet digunakan untuk mencegah grep menampilkan ke layar baris dimana kata running muncul. Ketika hal itu terjadi, perintah di atas mengembalikan status keluar 0 (diwakili oleh $? dalam konstruksi if), sehingga memverifikasi bahwa layanan sedang berjalan.

Status keluar yang berbeda dari 0 (artinya kata yang berjalan tidak ditemukan dalam keluaran systemctl status $service) menunjukkan bahwa layanan tidak berlari.

Kita dapat melangkah lebih jauh dan memeriksa keberadaan myservices.txt bahkan sebelum mencoba memasuki perulangan for.

#!/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
Melakukan ping ke serangkaian host jaringan atau internet untuk statistik balasan

Anda mungkin ingin menyimpan daftar host dalam file teks dan menggunakan skrip untuk menentukan sesekali apakah host tersebut dapat di-ping atau tidak (silakan ganti konten myhosts dan coba sendiri ).

Perintah bawaan read shell memberitahu loop while untuk membaca myhosts baris demi baris dan menetapkan konten setiap baris ke variabel host, yang kemudian diteruskan ke perintah ping.

#!/bin/bash

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

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

Baca Juga:

  1. Pelajari Shell Scripting: Panduan dari Pemula hingga Administrator Sistem
  2. 5 Skrip Shell untuk Mempelajari Pemrograman Shell

Pemecahan Masalah Sistem File

Meskipun Linux adalah sistem operasi yang sangat stabil, jika crash karena alasan tertentu (misalnya, karena pemadaman listrik), satu (atau lebih) sistem file Anda tidak akan di-unmount dengan benar dan dengan demikian akan secara otomatis diperiksa kesalahannya saat Linux dimulai ulang.

Selain itu, setiap kali sistem melakukan booting selama boot normal, sistem selalu memeriksa integritas sistem file sebelum memasangnya. Dalam kedua kasus ini dilakukan dengan menggunakan alat bernama fsck (“pemeriksaan sistem file ”).

fsck tidak hanya akan memeriksa integritas sistem file, namun juga berupaya memperbaiki sistem file yang rusak jika diperintahkan untuk melakukannya. Tergantung pada tingkat keparahan kerusakan, fsck mungkin berhasil atau tidak; ketika hal ini terjadi, bagian file yang dipulihkan akan ditempatkan di direktori hilang+ditemukan, yang terletak di akar setiap sistem file.

Yang terakhir, kita harus mencatat bahwa ketidakkonsistenan juga dapat terjadi jika kita mencoba melepaskan drive USB ketika sistem operasi masih menulis ke dalamnya, dan bahkan dapat mengakibatkan kerusakan perangkat keras.

Sintaks dasar fsck adalah sebagai berikut:

fsck [options] filesystem
Memeriksa kesalahan sistem file dan mencoba memperbaikinya secara otomatis

Untuk memeriksa sistem file dengan fsck, kita harus meng-unmount-nya terlebih dahulu.

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

Selain tanda -y, kita dapat menggunakan opsi -a untuk memperbaiki sistem berkas secara otomatis tanpa mengajukan pertanyaan apa pun, dan memaksa pemeriksaan meskipun sistem berkas terlihat bersih.

fsck -af /dev/sdg1

Jika kita hanya tertarik untuk mencari tahu apa yang salah (tanpa mencoba memperbaiki apa pun untuk saat ini) kita dapat menjalankan fsck dengan opsi -n, yang akan menampilkan masalah sistem file ke keluaran standar.

fsck -n /dev/sdg1

Bergantung pada pesan kesalahan di keluaran fsck, kita akan mengetahui apakah kita dapat mencoba menyelesaikan masalahnya sendiri atau meneruskannya ke tim teknik untuk melakukan pemeriksaan lebih lanjut pada perangkat keras.

Ringkasan

Kita telah sampai pada akhir seri 10 artikel ini yang mencoba membahas kompetensi domain dasar yang diperlukan untuk lulus ujian LFCS.

Karena alasan yang jelas, tidak mungkin untuk mencakup setiap aspek dari topik ini dalam satu tutorial saja, dan itulah mengapa kami berharap artikel ini dapat menempatkan Anda pada jalur yang benar untuk mencoba hal baru dan terus belajar.

Jika Anda memiliki pertanyaan atau komentar, kami selalu menyambutnya – jadi jangan ragu untuk menghubungi kami melalui formulir di bawah ini!