Automatizacija zadataka s shell skripte: primjeri za Linux terminal

Article Image

Zašto automatizovati ponavljene zadatke u Linux terminalu?

Kao korisnik Linuxa, verovatno svakodnevno izvršavate naredbe koje možete objediniti u jednu shell skriptu. Automatizacijom štede se vreme i smanjuje broj grešaka koje nastaju pri ručnom unosu komandi. Vi dobijate konzistentnost izvršavanja, lakše logovanje aktivnosti i mogućnost raspoređivanja zadataka pomoću cron‑a ili systemd timer‑a.

Ovaj vodič će vas provesti kroz osnovne koncepte i praktične korake koje trebate znati pre nego što počnete pisati skripte: kako strukturirati skriptu, kojim pravilima se pridržavati da bi bila prenosiva i bezbedna, te kako je učiniti izvršnom i integrisati u postojeće radne tokove.

Osnovni elementi shell skripte koje treba savladati

Pre nego što napišete složene skripte, upoznajte se s nekoliko ključnih elemenata koji čine skriptu čitljivom i pouzdanom:

  • Shebang: prva linija (npr. #!/bin/bash) govori koji interpreter će izvršavati skriptu.
  • Komentari: koristite # za objašnjenja; pomažu pri održavanju i razumevanju skripte kasnije.
  • Promenljive: čuvaju vrednosti koje ponovo koristite (npr. DIR=/var/backups).
  • Ulaz/izlaz i redirekcija: >, > , 2>&1 i pipe (|) su ključni za kombinovanje komandi.
  • Kontrola toka: if, for, while i case omogućavaju logiku u skripti.
  • Provera grešaka: koristite set -e, provere exit koda ($?) i jasno rukovanje greškama.

Dobro je usvojiti i princip “least privilege”: izvršavajte skripte s minimalnim potrebnim pravima, posebno kad manipulišete fajlovima sistema ili korisničkim podacima.

Kako pripremiti okruženje i napisati svoju prvu skriptu

Koraci za brzo pokretanje prve skripte su jednostavni i praktični:

  • Napravi fajl, npr. ~/bin/mojaskript.sh.
  • Dodaj shebang: #!/bin/bash ili #!/usr/bin/env bash za veću prenosivost.
  • Napiši jednostavne komande i komentare unutar fajla.
  • Učini fajl izvršnim: chmod +x ~/bin/mojaskript.sh.
  • Pokreni ga: ./mojaskript.sh ili iz pune putanje.

Dok pišete prve skripte, testirajte ih postepeno: dodajte jednu funkcionalnost, izvršite i proverite logove ili ispis grešaka. Ovo će vam pomoći da brzo izolujete i otklonite probleme.

U sledećem delu pokazaću vam konkretne primere skripti koje rešavaju uobičajene zadatke — pravljenje rezervnih kopija, automatsko ažuriranje sistema i čišćenje privremenih fajlova — sa objašnjenjima svake linije koda i sugestijama za prilagođavanje vašem okruženju.

Skriptа za pravljenje rezervne kopije direktorijuma

Primer jednostavne, ali robusne skripte koja pravi tar.gz arhivu od zadatog direktorijuma, čuva je u folderu za bekap i rotira starije arhive (čuva samo poslednjih N kopija).

#!/bin/bash
# Pravljenje rezervne kopije sa rotacijom
set -euo pipefail

SRC="/home/korisnik/projekat"
DEST_DIR="/var/backups/projekat"
KEEP=7
TIMESTAMP=$(date +%F_%H-%M-%S)
ARCHIVE="${DEST_DIR}/projekat_${TIMESTAMP}.tar.gz"
LOG="/var/log/backup_projekat.log"

mkdir -p "${DEST_DIR}"
tar -czf "${ARCHIVE}" -C "$(dirname "${SRC}")" "$(basename "${SRC}")"
echo "$(date +%F_%T) - Kreiran ${ARCHIVE}" >> "${LOG}"

# Rotacija: obriši starije od KEEP
ls -1t "${DEST_DIR}"/projekat_*.tar.gz | tail -n +$((KEEP+1)) | xargs -r rm --

Objašnjenje ključnih delova:

  • set -euo pipefail – bezbedniji režim: prekida na grešku, tretira nedefinisane promenljive kao grešku i propisno prenosi greške kroz pipe.
  • TIMESTAMP – dodaje vremensku oznaku kako bi arhive bile jedinstvene.
  • tar -czf – pravi kompresovanu arhivu; -C pomaže da arhiva nema apsolutne putanje.
  • Rotacija sa ls -1t i tail – čuva samo poslednjih N arhiva, ostale briše.

Saveti za prilagođavanje: promenite lokaciju DEST_DIR na eksterni disk ili mrežni share; dodajte verifikaciju (npr. tar -tzf) pre brisanja starih fajlova; koristite rsync za sinhronizaciju na drugo mesto.

Article Image

Automatsko ažuriranje sistema (primer za Debian/Ubuntu)

Jednostavna skripta za dnevno ili sedmično pokretanje ažuriranja, sa logovanjem i opcijom za “suvo pokretanje”—korisno pre nego što automatizujete u produkciji.

#!/bin/bash
# Ažuriranje paketa sa logovanjem
set -euo pipefail

LOG="/var/log/auto_update.log"
DRY_RUN=false

if [ "${1:-}" = "--dry" ]; then
  DRY_RUN=true
fi

echo "$(date +%F_%T) - Pokretanje ažuriranja (dry=${DRY_RUN})" >> "${LOG}"
sudo apt update >> "${LOG}" 2>&1

if [ "${DRY_RUN}" = true ]; then
  apt list --upgradable >> "${LOG}" 2>&1
else
  sudo DEBIAN_FRONTEND=noninteractive apt -y upgrade >> "${LOG}" 2>&1
fi

echo "$(date +%F_%T) - Završeno" >> "${LOG}"

Napomene:

  • Koristite --dry za pregled bez instalacije.
  • Za serverska okruženja razmotrite unattended-upgrades umesto vlastitih skripti ili kombinujte skriptu sa restart politikom (npr. obavesti admina ako je kernel update).
  • Uvek testirajte u staging okruženju pre automatskog izvršavanja.

Čišćenje privremenih fajlova i prostora na disku

Primer koji briše stare fajlove iz /tmp i korisničkih cache direktorijuma, uz opciju suvo pokretanje i log grešaka. Pažnja: pre brisanja proverite da ne uklonite aktivne procese.

#!/bin/bash
# Brisanje fajlova starijih od 7 dana
set -euo pipefail

TARGETS=("/tmp" "$HOME/.cache")
DAYS=7
DRY_RUN=false

if [ "${1:-}" = "--dry" ]; then
  DRY_RUN=true
fi

for dir in "${TARGETS[@]}"; do
  if [ "${DRY_RUN}" = true ]; then
    find "$dir" -type f -mtime +"${DAYS}" -print
  else
    find "$dir" -type f -mtime +"${DAYS}" -delete
  fi
done

Sugestije: prilagodite DAYS i TARGETS prema vašim potrebama; koristite -maxdepth da ograničite pretragu; razmislite o sigurnijem brisanju (premestite fajlove u karantin pre finalnog brisanja) ako skripta radi na delikatnim serverima.

Praktični saveti za dalje

Automatizacija skriptama najbolje se usavršava kroz male, ponovljive korake: počnite sa jednostavnim zadacima, dodajte logovanje i suvo pokretanje, zatim postepeno uvodite rotaciju, notifikacije i bezbednosne provere. Verzionišite skripte (git), koristite lint alate kao što je ShellCheck i testirajte promene u staging okruženju pre produkcije. Za detaljnije reference o Bash sintaksi i mogućnostima pogledajte GNU Bash Reference Manual.

  • Koristite set -euo pipefail i trap za čišćenje resursa.
  • Pokretanje u “dry-run” režimu pre promena smanjuje rizik.
  • Automatizujte raspoređivanje sa cron ili systemd timer-ima, ali pratite rezultate kroz logove i obaveštenja.
  • Držite osetljive podatke van samih skripti i ograničite pristup fajlovima.
Article Image

Frequently Asked Questions

Kako bezbedno testirati shell skripte pre pokretanja u produkciji?

Koristite “dry-run” opciju ako je dostupna, pokrenite skriptu u izolovanom/staging okruženju, uključite set -euo pipefail i trap za hvatanje grešaka, i proverite sintaksu sa shellcheck ili sh -n. Verzija i logovi su od pomoći pri reprodukciji grešaka.

Kako da rasporedim skripte za automatsko izvršavanje?

Najjednostavnije je koristiti cron (crontab -e) za periodične zadatke. Za složenije potrebe i bolju integraciju sa systemd servisima, koristite systemd timer-e. Uvek usmerite izlaz i greške u log fajl i dodajte mehanizme za obaveštavanje u slučaju neuspeha.

Gde čuvati osetljive podatke (lozinke, API ključeve) koje skripte koriste?

Ne hardkodujte lozinke u skripte. Koristite environment varijable, konfiguracione fajlove sa restriktivnim permisijama (chmod 600) ili menadžere tajni kao što su HashiCorp Vault ili cloud provajderi. Razmotrite i korišćenje sudoers pravila umesto pokretanja skripti kao root.

Praćenje, debagovanje i notifikacije

Kako skripte postanu deo proizvodnog toka, važno je uvesti mehanizme koji olakšavaju praćenje, debagovanje i obaveštavanje. Dobar pristup uključuje strukturisano logovanje (timestamp + nivo poruke), slanje kritičnih obaveštenja preko e‑maila ili webhookova i integraciju sa sistemima za praćenje.

Osnovne preporuke koje brzo podižu pouzdanost skripti:

  • Koristite journald ili rotirajuće log fajlove (/var/log) i logrotate za kontrolu veličine logova.
  • Implementirajte trap za hvatanje signala i čišćenje (trap ‘cleanup_function’ EXIT INT TERM).
  • Vrativši smislen exit kod (>0) omogućavate orkestratorima i monitoring sistemima da detektuju neuspehe.
  • Koristite mehanizme za sprečavanje paralelnog izvršavanja (flock, lockfile, PID fajl) kako biste izbegli konflikte.
  • Dodajte retry logiku sa eksponencijalnim backoff‑om za mrežne operacije.

Za debagovanje držite “verbose” režim (set -x) koji se uključuje samo u testiranju ili na zahtev, i obavezno filtrirajte osetljive podatke iz logova pre slanja u centralizovani sistem. Razmislite o automatskom pokretanju testova za skripte koristeći alate kao što je Bats, i o integraciji sa CI (GitLab CI, GitHub Actions) da bi svaka izmena bila testirana i proverena pre primene.

Distribucija i verzionisanje

  • Držite skripte u VCS (git) i koristite tagove za verzije.
  • Za širu upotrebu, instalirajte ih u usr/local/bin i dokumentujte u README ili man stranici.