Najbolje shell skripte za automatizaciju na Linux terminalu

Article Image

Zašto automatizovati zadatke u Linux terminalu i šta možete postići

Ako redovno koristite terminal, verovatno imate ponavljajuće zadatke koji oduzimaju vreme: bekapovanje podataka, rotacija logova, ažuriranje sistema, ili obrada velikih nizova fajlova. Automatizacijom pomoću shell skripti možete smanjiti greške, ubrzati rad i postići konzistentnost u svakodnevnim operacijama. Vi ne morate biti programer da biste napisali korisnu skriptu — dovoljno je poznavati osnovne komande i nekoliko dobrih praksi.

U ovom delu ćete saznati šta vam treba pre nego što počnete, osnovne koncepte koje treba razumeti i nekoliko tipičnih primera skripti koje će odmah olakšati posao. Cilj je da dobijete praktičan, razumljiv ulaz u svet shell automatizacije, uz naglasak na bezbednost i čitljivost.

Osnovna priprema i alati koje treba postaviti pre pisanja skripti

Pre nego što počnete da pišete ili pokrećete skripte, pobrinite se za sledeće stavke koje štede vreme i smanjuju rizik od grešaka:

  • Shebang i prava izvršenja: svaka skripta treba na početku imati shebang (npr. #!/bin/bash) i biti označena kao izvršna (chmod +x).
  • Testno okruženje: koristite nesistemski direktorijum ili kontejner da probate skripte pre pokretanja na produkciji.
  • Kontrola grešaka: koristite opcije kao što su set -e i set -u da otkrijete nepredviđene greške i neinicijalizovane promenljive.
  • Upravljanje verzijama: čuvajte skripte u Git repozitorijumu da biste mogli da pratite promene i vratite greške.
  • Logovanje i izlazni kodovi: svaki važan korak logujte u fajl i vraćajte smisleni exit kod kako bi drugi alati mogli da detektuju uspeh ili neuspeh.
  • Bezbednost i dozvole: izbegavajte hardkodovane lozinke; koristite sudo pažljivo i ograničite pristup skriptama samo korisnicima kojima je potreban.

Vrste jednostavnih skripti koje možete napisati odmah i kako ih strukturirati

Počnite sa malim, fokusiranim skriptama koje rešavaju jedan problem. Evo nekoliko praktičnih primera i saveta za strukturu:

  • Bekap fajlova: skripta koja arhivira direktorijum, dodaje vremenski žig i briše stare arhive. Struktura: promenljive za putanje, kompresija (tar + gzip), rotacija po starosti.
  • Provera prostora na disku: skripta koja šalje upozorenje kada slobodan prostor padne ispod praga. Koristite izlaz df i logujte rezultate.
  • Automatsko ažuriranje paketa: skripta koja pokreće apt/yum update i šalje izveštaj e-mailom ili u log. Uvek testirajte u kontrolisanom okruženju pre primene na produkciji.
  • Batch preimenovanje fajlova: korisno za fotografije ili izveštaje — koristite petlje, regex ili rename komandu i podržite opciju za “preview”.

Za čitljivost, podelite skriptu na funkcije, dokumentujte ulazne argumente i koristite getopts ako očekujete opcije komandne linije. U sledećem delu ćemo proći kroz konkretne, kompletne skripte korak-po-korak, objašnjavajući svaku liniju i dajući varijante za različite distribucije i potrebe.

Article Image

Kompletna skripta za bekapovanje sa rotacijom i logovanjem

Primer praktične skripte koja pravi arhivu direktorijuma, dodaje vremenski žig i briše arhive starije od određenog broja dana. Skripta koristi osnovne alate (tar, gzip, find) i pokazuje dobre prakse: promenljive na vrhu, log fajl i provera grešaka.

#!/bin/bash
set -euo pipefail
SRC="/home/user/data"
DEST="/var/backups/mydata"
RETENTION_DAYS=30
LOG="/var/log/mydata-backup.log"

mkdir -p "$DEST"
timestamp=$(date +%F_%H-%M-%S)
archive="$DEST/backup-$timestamp.tar.gz"

echo "$(date +%F %T) - START backing up $SRC" >> "$LOG"
tar -czf "$archive" -C "$(dirname "$SRC")" "$(basename "$SRC")"
echo "$(date +%F %T) - CREATED $archive" >> "$LOG"

# Rotate old backups
find "$DEST" -name 'backup-*.tar.gz' -mtime +"$RETENTION_DAYS" -print -exec rm -f {} ; >> "$LOG" 2>&1
echo "$(date +%F %T) - ROTATION complete (kept last $RETENTION_DAYS days)" >> "$LOG"

Objašnjenje linija: set -euo pipefail pomaže ranom izlazu na greške; promenljive olakšavaju prilagođavanje; tar sa -C pravi arhivu relativno; find sa -mtime briše stare arhive. Pokrenite prvo u testnom direktorijumu i proverite log.

Automatska provera prostora na disku i slanje upozorenja

Ova skripta proverava upotrebu particije i šalje e-mail ako prelazi zadati prag. Podržava i “pretpregled” i alternativne komande za slanje pošte (mailx, sendmail).

#!/bin/bash
set -euo pipefail
THRESHOLD=85
EMAIL="[email protected]"
LOG="/var/log/disk-alert.log"

usage(){ echo "Usage: $0 "; exit 2; }
[ $# -eq 1 ] || usage
MP="$1"

usage_check=$(df -hP "$MP" | awk 'NR==2 {print $5+0}')
if [ "$usage_check" -ge "$THRESHOLD" ]; then
  msg="Disk usage on $MP is ${usage_check}% (threshold ${THRESHOLD}%)"
  echo "$(date +%F %T) - ALERT: $msg" >> "$LOG"
  if command -v mailx >/dev/null 2>&1; then
    echo "$msg" | mailx -s "Disk alert: $MP" "$EMAIL"
  else
    echo -e "Subject: Disk alert: $MP

$msg" | sendmail "$EMAIL"
  fi
fi

Objašnjenje: df -hP daje stabilan format; awk izdvoji procenat; provera postojanja mailx omogućava portabilnost. U produkciji povežite ovu skriptu sa cron-om ili systemd timer-om za redovne provere.

Article Image

Batch preimenovanje fajlova sa opcijom “preview” i sigurnim pomeranjem

Često želite da masovno preimenujete fajlove (npr. ukloniti razmake ili dodati prefiks). Sledeća skripta podržava opciju –dry-run za prikaz promena bez izvršenja.

#!/bin/bash
set -euo pipefail
DRY_RUN=0
while [[ $# -gt 0 ]]; do
  case "$1" in
    --dry-run) DRY_RUN=1; shift;;
    --) shift; break;;
    *) files+=("$1"); shift;;
  esac
done

for f in "${files[@]}"; do
  base=$(basename "$f")
  new=$(echo "$base" | tr ' ' '_' )
  if [ "$base" != "$new" ]; then
    echo "MOVE: $f -> $(dirname "$f")/$new"
    if [ "$DRY_RUN" -eq 0 ]; then
      mv -- "$f" "$(dirname "$f")/$new"
    fi
  fi
done

Objašnjenje: podrška za –dry-run smanjuje rizik; tr koristi jednostavnu transformaciju; uvek koristite — kod za mv da se izbegnu problemi sa imenima koja počinju crtama. Možete proširiti logovanje i dodati undo fajl koji čuva stare/nove nazive.

Pre nego što pređete u produkciju, obavezno testirajte svaku skriptu u odvojenom okruženju, proverite dozvole, i dodajte detaljno logovanje. Razmislite o verzionisanju skripti (git) i dokumentovanju očekivanih ulaza/izlaza tako da budu lakše održive i deljive sa timom.

Sledeći koraci i preporuke

Automatizacija na terminalu postaje snažnija kad je bezbedna i reproducibilna — koristite kontrolu verzija, environment-specific konfiguracione fajlove, i ograničite privilegije (sudo samo kad je neophodno). Razmotrite prelazak sa cron-a na systemd timere za finiju kontrolu i nadzor, i uvek validirajte izlaz i greške u log fajlovima. Za detaljniju referencu o bash sintaksi i najboljim praksama, pogledajte Bash reference.

Frequently Asked Questions

Kako bezbedno testirati skriptu koja briše fajlove ili rotira backup?

Pokrenite skriptu u testnom direktorijumu sa lažnim podacima, koristite –dry-run kad je dostupno, pregledajte log pre i posle izvršenja, i dodajte unikatni prefiks/sufiks kako biste izbegli slučajne konflikte sa stvarnim podacima.

Šta koristiti za slanje obaveštenja kada mailx nije instaliran?

Ako mailx nije dostupan, možete pozvati sendmail ili koristiti alate poput ssmtp, msmtp ili slanje HTTP notifikacija prema Slack/Teams webhook-u. Uvek proverite da li je alat instaliran pre poziva i beležite neuspehe u log fajlu.

Da li je bolje koristiti cron ili systemd timer za redovne zadatke?

Oba pristupa rade, ali systemd timeri daju bolju integraciju sa systemd servisima, lakše upravljanje zavisnostima i finija kontrola pokretanja (npr. Backoff, persistencija). Za jednostavne zadatke cron je i dalje prihvatljiv i široko podržan.