Dasar Administrasi Sistem dengan Bash

Dasar Administrasi Sistem dengan Bash

Bitnesia • Aug 30, 2026 70 •EN

Bab 16 menutup Bagian 2 series ini dengan kustomisasi shell, prompt, alias, dan dotfiles portable untuk kebutuhan desktop sehari-hari. Bagian 3 dimulai dari bab ini dengan pergeseran fokus yang cukup besar: dari komputer pribadi ke server, dan dari peran User ke peran Sysadmin. Server yang dikelola sehari-hari, baik VPS kecil maupun cluster produksi, hampir selalu menjalankan Linux, jadi sebagian perintah yang dibahas sepanjang Bagian 3 memang spesifik ke ekosistem Linux dan berbeda dari padanannya di macOS, sesuatu yang akan ditandai eksplisit setiap kali relevan. Sebelum masuk ke topik yang lebih kompleks seperti cron di Bab 18 atau logging di Bab 19, Sysadmin butuh fondasi paling dasar lebih dulu: cara membaca kondisi sistem, mengelola proses yang berjalan, dan mengatur siapa yang boleh melakukan apa di server itu. Bab ini membahas tiga fondasi tersebut, informasi sistem lewat uname, uptime, df, du, dan free, manajemen proses lewat ps, top/htop, kill, dan nice, manajemen user dan permission lewat useradd, chmod, chown, dan sudo, lalu ditutup studi kasus menggabungkan semuanya jadi satu script audit kondisi server.

17.1 Informasi Sistem: uname, uptime, df, du, dan free

Sub-bab ini membahas lima perintah paling dasar untuk membaca kondisi sistem: identitas kernel, lama server menyala beserta beban kerjanya, pemakaian ruang disk, dan pemakaian memori. Kelimanya adalah perintah pertama yang biasa dijalankan Sysadmin begitu login ke server yang belum dikenal, sebelum menyelidiki masalah lebih jauh.

17.1.1 uname: Info Kernel dan Arsitektur

uname (Unix name), bagian dari GNU coreutils, mencetak informasi dasar tentang sistem operasi dan kernel yang sedang berjalan. Tanpa opsi apa pun, uname cuma mencetak nama kernel (Linux); opsi tambahan diperlukan untuk detail yang lebih berguna.

uname -a

Opsi -a (all) mencetak semua informasi sekaligus: nama kernel, hostname, versi rilis kernel, tanggal build, arsitektur mesin, dan nama sistem operasi, formatnya kurang lebih Linux nama-host 6.8.0-45-generic #45-Ubuntu SMP ... x86_64 GNU/Linux. Di lapangan, dua bagian yang paling sering dibutuhkan justru sering dipanggil terpisah supaya hasilnya gampang dipakai lagi di dalam script lain.

uname -r
uname -m

uname -r mencetak versi rilis kernel saja (misalnya 6.8.0-45-generic), penting dicek sebelum memasang kernel module atau driver yang mensyaratkan versi minimum tertentu. uname -m mencetak arsitektur mesin (x86_64, aarch64, dan sejenisnya), krusial saat mengunduh binary pihak ketiga yang dikompilasi per arsitektur; salah unduh binary aarch64 untuk server x86_64 berujung error "Exec format error" yang membingungkan kalau tidak tahu penyebabnya lebih dulu.

17.1.2 uptime: Load Average dan Waktu Aktif

uptime mencetak waktu saat ini, sudah berapa lama sistem menyala, jumlah user yang sedang login, dan load average, tiga angka yang mewakili rata-rata jumlah proses yang sedang berjalan atau menunggu giliran CPU dalam tiga jendela waktu berbeda.

uptime

Contoh outputnya berbentuk 14:32:05 up 21 days, 3:14, 2 users, load average: 0.45, 0.62, 0.58. Tiga angka terakhir masing-masing mewakili rata-rata beban dalam 1 menit, 5 menit, dan 15 menit terakhir, dihitung kernel dari /proc/loadavg di Linux. Angka load average sendiri tidak berarti apa-apa tanpa konteks jumlah core CPU yang tersedia; load average 4 di server dengan 8 core masih santai, tapi angka yang sama di server dengan 2 core sudah berarti antrean proses menumpuk. Cek jumlah core lewat nproc supaya interpretasinya tepat.

nproc

Untuk pembacaan yang lebih ringkas dan langsung dalam kalimat, opsi -p (pretty) menampilkan hanya durasi aktif tanpa detail load average maupun jumlah user.

uptime -p

17.1.3 df dan du: Pemakaian Disk

Bab 12.2.3 sempat menyinggung sekilas du lewat contoh wrapper script beropsi -d dan -a; sub-bab ini membahas du beserta pasangannya, df, lebih dalam. Kedua perintah ini sama-sama bagian dari GNU coreutils dan sama-sama soal disk, tapi menjawab pertanyaan yang berbeda: df (disk free) melaporkan sisa ruang per filesystem yang di-mount, sedangkan du (disk usage) melaporkan berapa besar ruang yang dipakai satu file atau folder tertentu.

df -h

Opsi -h (human-readable) menampilkan ukuran dalam satuan yang mudah dibaca (K, M, G) alih-alih angka byte mentah, dan didukung baik oleh GNU coreutils di Linux maupun BSD df bawaan macOS. Kolom Use% pada output df -h adalah kolom yang paling sering dipantau Sysadmin; filesystem yang sudah mendekati 100% berisiko membuat service gagal menulis log atau database gagal commit transaksi.

Begitu df -h menunjukkan satu filesystem nyaris penuh, pertanyaan berikutnya adalah folder mana yang menghabiskan ruang itu, dan di sinilah du berperan.

du -sh /var/log
du -h -d 1 /var | sort -rh | head

du -sh (summarize, human-readable) mencetak satu baris total ukuran untuk path yang diberikan, tanpa merinci isi di dalamnya. Opsi -d 1 (depth) membatasi kedalaman penelusuran cuma satu level ke bawah, sehingga hasilnya berupa daftar ukuran tiap subfolder langsung di dalam /var tanpa turun lebih dalam lagi; disambung sort -rh dari Bab 9, subfolder terbesar langsung muncul di baris paling atas. GNU du juga menyediakan --max-depth=1 sebagai bentuk panjang dari -d 1, tapi opsi pendek -d ini juga dikenali oleh du bawaan BSD/macOS, sedangkan --max-depth adalah ekstensi khusus GNU yang tidak tersedia di sana; membiasakan diri memakai -d membuat kebiasaan kita tetap portable di kedua platform.

Satu jebakan yang cukup sering ditemui di lapangan: df -h melaporkan filesystem penuh, tapi du -sh di seluruh folder yang masuk akal tidak menemukan file sebesar itu. Penyebab paling umum adalah proses yang masih memegang file handle ke sebuah file yang sudah dihapus; selama proses itu belum ditutup atau di-restart, kernel tetap mengalokasikan ruang disknya meski file itu sudah tidak muncul lagi di filesystem. lsof (kalau terpasang) bisa membantu melacak proses semacam ini lewat lsof +L1, yang mencetak daftar file berstatus terhapus tapi masih dibuka, topik yang akan disinggung lagi saat membahas troubleshooting jaringan dan proses di Bab 22.

17.1.4 free: Pemakaian Memori dan Swap

free, bagian dari paket procps/procps-ng yang tersedia default di hampir semua distro Linux, mencetak ringkasan pemakaian memori fisik (RAM) dan swap. Perintah ini spesifik Linux; macOS tidak menyediakan free sama sekali dan memakai vm_stat sebagai gantinya, jadi sub-bab ini murni berlaku untuk server Linux yang jadi fokus Bagian 3.

free -h

Output free -h menampilkan dua baris utama, Mem dan Swap, dengan kolom total, used, free, shared, buff/cache, dan available. Kolom yang paling sering disalahartikan adalah free: angka ini bukan ukuran memori yang benar-benar bisa dipakai aplikasi baru, melainkan memori yang sama sekali belum disentuh sejak boot. Linux secara sengaja memakai RAM yang menganggur untuk page cache (kolom buff/cache) supaya operasi baca file berikutnya lebih cepat, dan kernel akan langsung melepas cache itu begitu aplikasi lain butuh memori. Kolom available adalah estimasi yang jauh lebih akurat soal berapa memori yang sebenarnya masih bisa dipakai tanpa mulai memakai swap, karena sudah memperhitungkan kemungkinan pelepasan cache itu. Sysadmin yang panik melihat kolom free kecil padahal server baik-baik saja adalah kesalahpahaman yang sangat umum ditemui, terutama oleh yang baru pertama kali mengelola server Linux.

Menggabungkan kelima perintah di atas jadi satu snapshot cepat kondisi server adalah kebiasaan yang lazim dilakukan Sysadmin di awal sesi troubleshooting.

echo "Host: $(uname -n) | Kernel: $(uname -r)"
uptime -p
df -h /
free -h

17.2 Manajemen Proses: ps, top/htop, kill, dan nice

Sub-bab ini membahas cara melihat proses yang sedang berjalan di server, memantaunya secara real-time, menghentikannya dengan aman, dan mengatur prioritas CPU-nya. Kemampuan ini penting terutama saat server terasa lambat dan Sysadmin perlu mencari tahu proses mana yang jadi biang keroknya.

17.2.1 ps: Snapshot Proses

ps (process status) mencetak daftar proses yang sedang berjalan pada saat perintah dijalankan, berbeda dari top di 17.2.2 yang terus memperbarui tampilannya. ps punya sejarah panjang dengan dua gaya opsi yang berbeda, gaya BSD tanpa tanda hubung dan gaya System V dengan tanda hubung, dan implementasi ps di Linux (dari paket procps-ng) mendukung keduanya sekaligus.

ps aux
ps -ef

ps aux (gaya BSD) menampilkan semua proses milik semua user (a), termasuk proses tanpa controlling terminal (x), dengan format user-oriented (u) yang menyertakan kolom %CPU dan %MEM. ps -ef (gaya System V) menampilkan semua proses (-e) dalam format lengkap (-f) yang menonjolkan kolom PPID (parent process ID), lebih memudahkan menelusuri proses mana yang me-spawn proses mana. Keduanya sama validnya; pilih sesuai kolom mana yang lebih dibutuhkan saat itu.

Mencari proses paling rakus CPU atau memori tanpa perlu membuka top juga bisa langsung lewat ps dengan opsi --sort.

ps aux --sort=-%cpu | head -n 6

Tanda minus di depan %cpu mengurutkan dari nilai terbesar ke terkecil (descending); tanpa tanda minus, urutannya ascending. head -n 6 dari Bab 2.3 memangkas outputnya jadi baris header plus lima proses teratas saja, pola yang nanti dipakai lagi di studi kasus 17.4.

17.2.2 top dan htop: Monitoring Real-Time

top, juga bagian dari procps-ng dan terpasang default di hampir semua distro Linux, menampilkan daftar proses yang diperbarui otomatis tiap beberapa detik, lengkap dengan ringkasan pemakaian CPU dan memori keseluruhan di bagian atas layar.

top

Beberapa keyboard shortcut di dalam top yang paling sering dipakai Sysadmin: P mengurutkan berdasarkan pemakaian CPU (urutan default), M mengurutkan berdasarkan pemakaian memori, k mengirim signal ke sebuah proses tanpa keluar dari top (akan diminta memasukkan PID dan nomor signal), dan q keluar dari tampilan. htop adalah alternatif pihak ketiga yang populer, menawarkan tampilan berwarna, dukungan mouse, dan tampilan pohon proses (process tree) yang memperjelas relasi parent-child, tapi berbeda dari top, htop hampir tidak pernah terpasang default dan perlu dipasang manual lewat package manager.

# Debian/Ubuntu
sudo apt install htop

# Fedora
sudo dnf install htop

# Arch Linux
sudo pacman -S htop

Di lapangan, kebiasaan yang wajar adalah mengecek dulu apakah htop tersedia sebelum server jadi tidak bisa diakses jaringan (misalnya lewat SSH yang sedang bermasalah); top yang selalu ada tanpa instalasi tambahan tetap jadi andalan utama saat waktu terbatas atau akses ke package manager tidak memungkinkan.

17.2.3 kill dan Signal Proses

kill tidak benar-benar "membunuh" proses secara langsung; ia mengirim signal, semacam sinyal interupsi tingkat kernel, ke proses target lewat PID-nya, dan proses itu sendiri yang menentukan bagaimana meresponnya. Tabel berikut merangkum signal yang paling umum dipakai Sysadmin sehari-hari.

SignalNomor (umum di x86/x86_64)Kegunaan
SIGHUP1Awalnya sinyal putus koneksi terminal; banyak daemon memakainya sebagai perintah "muat ulang konfigurasi"
SIGINT2Sinyal yang sama dikirim saat menekan Ctrl+C
SIGTERM15Permintaan berhenti secara graceful; signal default kill tanpa nomor
SIGKILL9Paksa berhenti seketika, tidak bisa ditangkap atau diabaikan proses target
kill 4821
kill -9 4821
kill -l

kill 4821 tanpa opsi nomor signal mengirim SIGTERM secara default, memberi kesempatan proses menutup file handle, menyelesaikan transaksi yang sedang berjalan, dan membersihkan dirinya sendiri sebelum benar-benar berhenti. kill -9 4821 mengirim SIGKILL, dihentikan paksa oleh kernel tanpa proses itu sendiri diberi kesempatan membersihkan apa pun. kill -l mencetak daftar lengkap nama signal yang dikenal sistem beserta nomornya. Nomor signal seperti pada tabel di atas konsisten di sebagian besar arsitektur, tapi menurut spesifikasi POSIX beberapa nomor signal (terutama SIGSTOP dan sekitarnya) bisa berbeda di arsitektur yang lebih jarang dipakai, jadi kebiasaan yang lebih aman dan portable adalah memakai nama signal (kill -TERM, kill -KILL) daripada menghafal nomornya, kecuali untuk -9 dan -15 yang sudah jadi konvensi universal di kalangan Sysadmin.

Prinsip kehati-hatian di sini penting ditegaskan: SIGKILL memang efektif menghentikan proses yang macet total dan tidak merespons SIGTERM, tapi risikonya nyata, terutama untuk proses yang sedang menulis ke file atau database. Kebiasaan yang benar adalah selalu mencoba SIGTERM lebih dulu, memberi jeda beberapa detik, baru beralih ke SIGKILL kalau proses itu masih belum berhenti juga. Untuk mencari dan menghentikan proses berdasarkan nama tanpa perlu mencari PID-nya manual lewat ps lebih dulu, pkill nama_proses dan killall nama_proses tersedia sebagai jalan pintas; pkill mencocokkan pola nama proses, sedangkan killall mensyaratkan kecocokan nama persis.

17.2.4 nice dan renice: Prioritas Proses

Kadang proses yang rakus CPU bukan proses yang salah dan perlu dihentikan, melainkan proses sah yang cuma perlu "mengalah" sedikit supaya tidak mengganggu service lain yang lebih kritis. nice (GNU coreutils) menjalankan sebuah proses baru dengan tingkat prioritas tertentu, dinyatakan lewat angka niceness dari -20 (prioritas tertinggi) sampai 19 (prioritas terendah), dengan 0 sebagai nilai default.

nice -n 10 ./backup-besar.sh

Perintah di atas menjalankan backup-besar.sh dengan niceness 10, membuatnya lebih "mengalah" ke proses lain saat CPU sedang penuh, cocok untuk task berat seperti backup atau kompresi arsip (Bab 21) yang tidak butuh selesai secepat mungkin selama tidak mengganggu service utama. Menurunkan niceness (menaikkan prioritas) di bawah 0 mensyaratkan hak akses root, karena berpotensi membuat satu proses "merampas" jatah CPU dari proses lain di sistem yang sama.

Untuk proses yang sudah telanjur berjalan tanpa nice sejak awal, renice (bagian dari paket util-linux) mengubah niceness-nya tanpa perlu menghentikan dan menjalankan ulang prosesnya.

renice -n 15 -p 4821

Ini jadi alternatif yang lebih ramah dibanding langsung kill untuk kasus proses yang tetap perlu selesai berjalan tapi sedang mengganggu proses lain; menurunkan prioritasnya lewat renice memberi ruang napas ke service lain tanpa harus mengorbankan proses yang sedang berjalan itu sama sekali.

17.3 Manajemen User dan Permission

Sub-bab ini membahas cara membuat user baru, mengatur permission dan kepemilikan file, serta mendelegasikan akses administratif lewat sudo tanpa membagikan password root secara langsung. Server yang dikelola lebih dari satu orang, atau dipakai menjalankan lebih dari satu service, nyaris selalu butuh pemisahan user yang jelas demi keamanan dan akuntabilitas, topik yang akan diperdalam lagi dari sisi keamanan di Bab 23.

17.3.1 useradd dan adduser: Membuat User Baru

useradd adalah utilitas tingkat rendah untuk membuat user baru, bagian dari kumpulan tool shadow-utils (nama proyek hulunya "shadow") yang fungsinya tersedia luas di hampir semua distro Linux. Nama paket pembungkusnya di package manager sendiri bisa berbeda-beda per distro, jadi jangan berasumsi satu nama paket berlaku universal saat mencarinya; cek lewat dpkg -S $(command -v useradd) di Debian/Ubuntu atau rpm -qf $(command -v useradd) di RHEL/Fedora kalau perlu memastikan nama paket persisnya di sistem yang sedang dikelola. Perilaku defaultnya juga cukup berbeda antar distro, jadi perlu dicek eksplisit, bukan diasumsikan sama di mana pun.

sudo useradd -m -s /bin/bash deploy
sudo passwd deploy

Opsi -m (create home) membuat direktori /home/deploy beserta isi skeleton default dari /etc/skel, dan -s menentukan login shell user itu. passwd deploy dijalankan terpisah setelahnya untuk mengatur password, karena useradd sendiri tidak mengatur password secara default. Opsi -G menambahkan user ke satu atau lebih grup tambahan sekaligus saat pembuatan, dipisah koma.

sudo useradd -m -s /bin/bash -G docker,sudo deploy

Detail yang penting dan sering luput: apakah opsi -m di atas benar-benar wajib ditulis manual atau tidak, tergantung isi /etc/login.defs di distro yang dipakai. Tabel berikut merangkum perbedaan perilaku default antar keluarga distro populer; kalau ragu, cek langsung isi CREATE_HOME di /etc/login.defs server yang sedang dikelola sebelum mengasumsikan salah satunya.

Distrouseradd tanpa -madduser
Debian/UbuntuHome direktori tidak otomatis dibuatScript Perl terpisah, interaktif, otomatis buat home + tanya password
RHEL/CentOS/FedoraHome direktori otomatis dibuat (CREATE_HOME yes default)Symlink langsung ke useradd, bukan tool terpisah

Di Debian dan Ubuntu, adduser (tanpa use di depan) adalah wrapper berbasis Perl yang jauh lebih ramah dipakai interaktif: cukup sudo adduser deploy, dan ia otomatis membuat home direktori, menyalin isi /etc/skel, serta menanyakan password dan beberapa info tambahan lewat prompt. Karena sifatnya yang interaktif itu, adduser versi Debian/Ubuntu ini kurang cocok dipakai di dalam script otomatis dibanding useradd yang sepenuhnya non-interaktif; kebiasaan yang wajar di lapangan adalah memakai adduser untuk pembuatan user manual satu-satu, dan useradd dengan opsi lengkap seperti contoh di atas untuk kebutuhan otomatisasi atau provisioning server baru (Bab 24).

17.3.2 chmod dan chown: Permission dan Kepemilikan

Setiap file dan direktori di Linux punya tiga lapis izin akses, read (r), write (w), dan execute (x), yang masing-masing berlaku terpisah untuk tiga kelompok: owner (pemilik file), group (grup pemilik), dan others (semua user lain). chmod (change mode) mengubah kombinasi izin ini, lewat dua notasi berbeda: numerik dan simbolik.

chmod 755 deploy.sh
chmod u+x deploy.sh

Notasi numerik menjumlahkan nilai tiap izin, r=4, w=2, x=1, untuk masing-masing dari tiga kelompok berurutan (owner, group, others). Tabel berikut merangkum kombinasi paling umum ditemui.

Notasi numerikArtiKegunaan umum
644rw-r--r--File biasa, hanya owner bisa menulis
600rw-------File sensitif seperti kunci SSH privat, hanya owner bisa baca/tulis
755rwxr-xr-xScript atau binary yang boleh dijalankan semua orang, ditulis hanya owner
700rwx------Direktori privat, hanya owner yang bisa masuk dan melihat isinya

Notasi simbolik memakai kombinasi target (u=user/owner, g=group, o=others, a=all), operator (+ menambah, - mencabut, = menetapkan persis), dan izin (r, w, x). Notasi ini lebih pas dipakai saat hanya perlu mengubah satu izin spesifik tanpa mengubah dua izin lain yang sudah ada, misalnya chmod u+x deploy.sh di atas cukup menambahkan izin eksekusi untuk owner tanpa menyentuh izin group dan others yang sudah ada sebelumnya, kebalikan dari notasi numerik yang selalu menetapkan ketiga kelompok izin sekaligus dari nol.

sudo chown deploy:deploy /var/www/aplikasi
sudo chown -R deploy:www-data /var/www/aplikasi

chown (change owner) mengubah kepemilikan file, ditulis user:group; kalau bagian grup dihilangkan (cukup chown deploy file), hanya kepemilikan user yang berubah, grup tetap seperti semula. Opsi -R (recursive) menerapkan perubahan ke seluruh isi direktori beserta subdirekturinya, dipakai luas untuk menyerahkan kepemilikan seluruh folder aplikasi ke user service yang menjalankannya. Salah kepemilikan atau permission adalah salah satu penyebab paling umum service gagal start di server, biasanya muncul lewat pesan error Permission denied di log; verifikasi cepatnya cukup lewat ls -l dari Bab 2.2 untuk melihat kombinasi permission dan kepemilikan sebuah file sekaligus.

17.3.3 sudo: Delegasi Akses Root

sudo (superuser do) memungkinkan user biasa menjalankan perintah tertentu dengan hak akses root, tanpa perlu tahu atau memakai password root itu sendiri secara langsung. Aturan siapa boleh menjalankan apa dikonfigurasi di /etc/sudoers, tapi file ini tidak boleh diedit langsung memakai nano atau editor lain; wajib lewat visudo.

sudo visudo

visudo mengunci file /etc/sudoers selama proses edit berlangsung dan, yang jauh lebih penting, memvalidasi sintaksnya sebelum benar-benar menyimpan perubahan. Kesalahan sintaks kecil di /etc/sudoers yang diedit langsung lewat editor biasa bisa membuat sudo berhenti berfungsi sama sekali untuk semua user di server itu, termasuk untuk memperbaiki kesalahan itu sendiri; visudo mencegah skenario ini dengan menolak menyimpan file yang sintaksnya tidak valid.

Untuk kebutuhan sehari-hari yang lebih umum, menambahkan user ke grup administratif yang sudah terdaftar di /etc/sudoers jauh lebih aman dan lebih umum dipraktikkan dibanding mengedit /etc/sudoers langsung setiap kali ada user baru. Nama grup ini berbeda antar distro.

# Debian/Ubuntu
sudo usermod -aG sudo deploy

# RHEL/CentOS/Fedora
sudo usermod -aG wheel deploy

Opsi -aG pada usermod penting ditulis persis begitu, -a (append) memastikan user ditambahkan ke grup baru tanpa dicabut dari grup-grup lain yang sudah dimilikinya; menghilangkan -a membuat -G menimpa seluruh daftar grup tambahan user itu dengan hanya grup yang disebutkan, sebuah kesalahan yang bisa mencabut akses user itu dari grup lain yang sebenarnya masih dibutuhkan tanpa disadari.

Baris konfigurasi di /etc/sudoers juga bisa membebaskan user tertentu dari diminta password setiap kali memakai sudo, lewat kata kunci NOPASSWD.

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart aplikasi

Baris di atas cuma mengizinkan user deploy menjalankan satu perintah spesifik, systemctl restart aplikasi, tanpa password. Ini contoh penerapan prinsip hak akses minimal (principle of least privilege): user hanya diberi akses ke perintah yang benar-benar ia butuhkan, bukan akses penuh ke semua perintah. Menuliskan deploy ALL=(ALL) NOPASSWD: ALL secara sengaja untuk semua perintah memang tergoda karena lebih praktis, tapi risikonya besar, karena efeknya nyaris setara memberi akses root penuh tanpa pengamanan password apa pun; topik hardening akses semacam ini dibahas lebih dalam di Bab 23. Cek perintah apa saja yang boleh dijalankan user yang sedang login lewat sudo tanpa perlu membaca /etc/sudoers secara langsung.

sudo -l

17.4 Studi Kasus: Script Audit Kondisi Server

Studi kasus penutup ini menggabungkan seluruh perintah di 17.1 sampai 17.3 jadi satu script audit yang mencetak kondisi server secara ringkas: info sistem, pemakaian disk dengan peringatan ambang batas, pemakaian memori, proses paling rakus CPU, dan user yang sedang login. Script semacam ini adalah pola yang sangat umum dipakai Sysadmin sebagai langkah pertama sebelum menjadwalkannya lewat cron di Bab 18, mengirim hasilnya lewat alert di Bab 20, atau mengembangkannya jadi bagian dari toolkit keamanan di Bab 23.

17.4.1 Rancangan Script

Script ini dirancang menerima dua opsi lewat getopts seperti pola baku yang sudah dibahas di Bab 12.2.3: -t untuk menentukan ambang batas persentase disk yang dianggap peringatan (default 80), dan -o untuk menyimpan hasilnya ke sebuah file alih-alih hanya tampil di layar. Struktur logikanya dipecah jadi beberapa fungsi terpisah, mengikuti kebiasaan Bab 8, supaya tiap bagian pengecekan gampang dibaca dan gampang dikembangkan lebih lanjut tanpa mengganggu bagian lain. Script juga mengembalikan exit status 1 kalau ada filesystem yang melewati ambang batas, mengikuti konvensi exit status dari Bab 6.4, supaya nanti bisa langsung dipakai sebagai kondisi pemicu alert otomatis di Bab 20 tanpa perlu di-parsing ulang dari teks outputnya.

17.4.2 Implementasi Script

#!/bin/bash

THRESHOLD=80
OUTPUT=""

usage() {
    printf 'Pemakaian: %s [-t ambang_persen] [-o file_output]\n' "$0" >&2
    exit 1
}

while getopts ":t:o:h" opt; do
    case "$opt" in
        t) THRESHOLD="$OPTARG" ;;
        o) OUTPUT="$OPTARG" ;;
        h) usage ;;
        :) echo "Error: opsi -$OPTARG butuh sebuah argumen" >&2; exit 1 ;;
        \?) echo "Error: opsi tidak dikenal: -$OPTARG" >&2; exit 1 ;;
    esac
done

cek_info_sistem() {
    printf '=== Info Sistem ===\n'
    printf 'Hostname   : %s\n' "$(uname -n)"
    printf 'Kernel     : %s\n' "$(uname -r)"
    printf 'Uptime     : %s\n' "$(uptime -p)"
    printf 'User login : %s\n' "$(who | wc -l)"
}

cek_disk() {
    local status=0
    local fs pct target angka_pct

    printf '\n=== Pemakaian Disk (ambang %s%%) ===\n' "$THRESHOLD"
    while read -r fs pct target; do
        [[ "$fs" == "Filesystem" ]] && continue
        angka_pct=${pct%\%}
        if (( angka_pct >= THRESHOLD )); then
            printf '[PERINGATAN] %-20s %s%% (%s)\n' "$fs" "$angka_pct" "$target"
            status=1
        else
            printf '[OK]         %-20s %s%% (%s)\n' "$fs" "$angka_pct" "$target"
        fi
    done < <(df -h --output=source,pcent,target)

    return "$status"
}

cek_memori() {
    printf '\n=== Pemakaian Memori ===\n'
    free -h
}

cek_top_proses() {
    printf '\n=== 5 Proses Teratas (CPU) ===\n'
    ps aux --sort=-%cpu | head -n 6
}

laporan() {
    cek_info_sistem
    cek_disk
    local status_disk=$?
    cek_memori
    cek_top_proses
    return "$status_disk"
}

if [[ -n "$OUTPUT" ]]; then
    laporan > "$OUTPUT"
    exit_code=$?
    echo "Laporan tersimpan di: $OUTPUT"
else
    laporan
    exit_code=$?
fi

exit "$exit_code"

cek_disk memakai df -h --output=source,pcent,target, opsi --output yang memilih kolom mana saja yang ditampilkan, jauh lebih aman diproses lewat read dibanding memparsing output df -h polos yang jumlah kolomnya bisa berubah tergantung panjang nama filesystem. Perlu dicatat, --output adalah ekstensi khusus GNU coreutils, tidak tersedia di df bawaan BSD/macOS, jadi bagian ini murni ditulis untuk server Linux, konsisten dengan fokus Bagian 3. Pola done < <(df -h ...) memakai process substitution yang sudah diperkenalkan di Bab 7.4, dipilih secara sengaja alih-alih menyalurkan lewat pipe biasa (df ... | while read ...), karena pipe biasa menjalankan bagian while di dalam subshell terpisah, membuat perubahan variabel status di dalamnya tidak ikut terbawa keluar loop, sebuah jebakan klasik yang gampang luput disadari.

Fungsi laporan secara sengaja menyimpan exit status dari cek_disk lebih dulu ke status_disk sebelum memanggil fungsi lain, karena $? selalu terikat ke perintah paling terakhir yang dijalankan; kalau langsung dipakai belakangan setelah cek_memori dan cek_top_proses berjalan, nilainya sudah keburu tertimpa exit status kedua fungsi itu, bukan lagi milik cek_disk.

17.4.3 Verifikasi dan Uji Coba

Beri izin eksekusi lebih dulu seperti kebiasaan sejak Bab 1.4.1, lalu jalankan tanpa opsi apa pun untuk melihat output ke layar.

chmod +x audit-server.sh
./audit-server.sh

Coba juga dengan ambang batas yang sengaja rendah supaya baris [PERINGATAN] pasti muncul, berguna untuk memastikan logika perbandingannya benar sebelum dipakai di server produksi.

./audit-server.sh -t 1

Simpan hasilnya ke file lewat opsi -o, lalu cek exit status-nya secara terpisah.

./audit-server.sh -t 80 -o /tmp/audit-$(date +%Y%m%d).log
echo "Exit status: $?"

Exit status 0 berarti seluruh filesystem masih di bawah ambang batas, sedangkan 1 berarti ada minimal satu filesystem yang perlu diperhatikan. Kalau opsi tidak dikenal diberikan, misalnya ./audit-server.sh -x, script harus langsung berhenti dengan pesan Error: opsi tidak dikenal: -x ke stderr, sesuai penanganan mode silent getopts yang sudah dibahas di Bab 12.2.3. Script sesederhana ini sudah cukup jadi fondasi pengecekan kondisi server harian; Bab 18 melanjutkan dari sini dengan cara menjadwalkannya berjalan otomatis lewat cron dan systemd timer, tanpa perlu dijalankan manual setiap kali.