...

Hogyan automatizáld az ismétlődő Linux feladatokat Bash szkriptekkel

Ha már régóta Linuxot használsz, biztosan előfordult, hogy ugyanazokat a parancsokat kellett begépelned újra és újra. Rendszerfrissítés, logfájlok takarítása, fontos mappák biztonsági mentése, lemezterület ellenőrzése — ezek mind olyan feladatok, amelyeket érdemes automatizálni. A Bash szkriptelés az a módszer, amellyel a tapasztalt Linux-felhasználók ideős spórolnak — és ez egyszrűbb mint gondolnád.

Ez az útmutató nem csak elmagyarázza, mi az a Bash — négy valóban hasznos szkriptet fogsz felépíteni nulláról, amelyek mindegyike egy valós problémát old meg. Az útmutató végére egy saját automatizálási eszközkészleted lesz, amelyet azonnal használhatsz.


Amire szükséged lesz

  • Egy Linux rendszer Bash-sel (gyakorlatilag minden disztrón előre telepítve van)
  • Alapszintű terminálismeret (tudod, hogyan kell cd-zni, ls-ezni, parancsokat futtatni)
  • Egy szövegszerkesztő — nano, vim, vagy akár gedit is megfelel

Mielőtt belevágnánk, ellenőrizd a Bash verziódat:

bash --version

A Bash 4.x-től felfelé minden rendben van. A legtöbb modern disztró már az 5.x sorozatot szállítja.


1. rész: Egy Bash szkript anatómiája

Mielőtt valami hasznosat írnánk, nézzük meg azt a három dolgot, amelyek minden Bash szkripthez kellenek.

1. A shebang sor

Minden szkript ezzel kezdődik az első sorban:

#!/bin/bash

Ez megmondja a rendszernek, hogy Bash-sel értelmezze a fájlt, függetlenül attól, éppen milyen shellt használsz.

2. Futtathatóvá tétel

A szkriptfájl csak egy szöveges fájl, amíg nem adsz neki futtatási jogosultságot:

chmod +x sajatszkript.sh

3. Futtatás

./sajatszkript.sh

Vagy bárhonnan, ha a ~/.local/bin/ mappába helyezed (amelynek alapértelmezés szerint benne kell lennie a $PATH-odban):

sajatszkript.sh

Most építsünk valami valódit.


1. szkript: Rendszerfrissítés és takarítás egy paranccsal

A probléma: Rendszeresen futtatod a sudo apt update && sudo apt upgrade -y parancsot, de elfelejted utána kitakarítani a régi csomagokat és a gyorsítótárat.

A megoldás: Egy szkript, amely elvégzi az egész munkát.

Hozz létre egy új fájlt:

nano ~/szkriptek/rendszer-frissites.sh

Másold bele ezt:

#!/bin/bash

echo "=== Rendszerfrissítés elkezdődött ==="

# Disztró felismerése és a megfelelő csomagkezelő használata
if command -v apt &> /dev/null; then
    sudo apt update && sudo apt upgrade -y
    sudo apt autoremove -y
    sudo apt autoclean
elif command -v dnf &> /dev/null; then
    sudo dnf upgrade -y
    sudo dnf autoremove -y
elif command -v pacman &> /dev/null; then
    sudo pacman -Syu --noconfirm
fi

echo ""
echo "=== Frissítés kész! ==="
echo "Lemezhasználat a takarítás után:"
df -h /

Tedd futtathatóvá és indítsd el:

chmod +x ~/szkriptek/rendszer-frissites.sh
./szkriptek/rendszer-frissites.sh

Mi történik itt?

  • A command -v ellenőrzi, hogy egy adott program létezik-e — ez teszi a szkriptet kompatibilissé Debian-, Fedora- és Arch-alapú rendszerekkel egyaránt
  • A &> /dev/null elnémítja magának az ellenőrzésnek a kimenetét
  • A df -h / megmutatja, mennyi helyet szabadítottál fel

2. szkript: Automatikus biztonsági mentés időbélyeggel

A probléma: Rendszeresen biztonsági mentést szeretnél készíteni egy fontos mappáról, de a kézi másolgatás felülírja a tegnapi mentést.

Hozd létre a szkriptet:

nano ~/szkriptek/mentes.sh
#!/bin/bash

# ---- Beállítások ----
FORRAS_MAPPA="$HOME/Dokumentumok"
MENTES_MAPPA="$HOME/Mentések"
# ---------------------

# Mentési mappa létrehozása, ha nem létezik
mkdir -p "$MENTES_MAPPA"

# Időbélyeg generálása: pl. 2026-05-03_14-30-00
IDOPELYEG=$(date +"%Y-%m-%d_%H-%M-%S")
MENTES_NEV="dokumentumok_mentes_$IDOPELYEG.tar.gz"

echo "Mentés folyamatban: $FORRAS_MAPPA..."

tar -czf "$MENTES_MAPPA/$MENTES_NEV" "$FORRAS_MAPPA"

if [ $? -eq 0 ]; then
    echo "✓ Sikeres mentés: $MENTES_MAPPA/$MENTES_NEV"
    echo "  Méret: $(du -sh "$MENTES_MAPPA/$MENTES_NEV" | cut -f1)"
else
    echo "✗ A mentés SIKERTELEN. Ellenőrizd a jogosultságokat és a szabad lemezhelyet."
    exit 1
fi

# Opcionális: 7 napnál régebbi mentések törlése
# find "$MENTES_MAPPA" -name "*.tar.gz" -mtime +7 -delete
# echo "Régi mentések törölve."

Fontos fogalmak:

  • A $() parancshelyettesítés — egy parancs kimenetét változóba menti
  • A $? az utolsó parancs kilépési kódja: 0 = sikeres, bármi más = hiba
  • A tar -czf tömörített (gzip) archívumot hoz létre
  • A takarítási sor alapértelmezés szerint ki van kommentelve — ha magabiztosan használod a szkriptet, távolítsd el a # jelet

Módosítsd a FORRAS_MAPPA értékét a védeni kívánt mappára, majd futtasd:

chmod +x ~/szkriptek/mentes.sh
./szkriptek/mentes.sh

3. szkript: Lemezterület-figyelő riasztással

A probléma: A lemezed csendben megtelik, és csak akkor veszed észre, amikor valami elromlik.

Ez a szkript ellenőrzi a lemezhasználatot, és figyelmeztetést ír egy naplófájlba (valamint opcionálisan asztali értesítést küld), ha a használat átlép egy küszöbértéket.

nano ~/szkriptek/lemez-figyelő.sh
#!/bin/bash

KUSZOB=80
NAPLO_FAJL="$HOME/.lemez-figyelő.log"
PARTICIO="/"

# Aktuális használati százalék lekérése (%-jel nélkül)
HASZNALAT=$(df "$PARTICIO" | awk 'NR==2 {print $5}' | tr -d '%')

DATUM=$(date "+%Y-%m-%d %H:%M")

if [ "$HASZNALAT" -ge "$KUSZOB" ]; then
    UZENET="[$DATUM] FIGYELMEZTETÉS: $PARTICIO ${HASZNALAT}%-on van!"
    echo "$UZENET" | tee -a "$NAPLO_FAJL"

    # Asztali értesítés (GNOME/KDE asztalokon működik)
    if command -v notify-send &> /dev/null; then
        notify-send "Lemezterület riasztás" "$PARTICIO teli van ${HASZNALAT}%-ban!" --urgency=critical
    fi
else
    echo "[$DATUM] OK: $PARTICIO ${HASZNALAT}% — biztonságos határon belül." >> "$NAPLO_FAJL"
fi

Futtasd kézzel először a teszteléshez:

chmod +x ~/szkriptek/lemez-figyelő.sh
./szkriptek/lemez-figyelő.sh

Majd ellenőrizd a naplót:

cat ~/.lemez-figyelő.log

A riasztás teszteléséhez ideiglenesen állítsd KUSZOB=1-re — a lemezed szinte biztosan több mint 1%-on van.


2. rész: Szkriptek ütemezése Cronnal

A szkriptek megírása csak a munka fele. Az igazi erő abban rejlik, hogy automatikusan futnak egy ütemterv szerint, a cron segítségével.

Nyisd meg a személyes crontab-fájlodat:

crontab -e

A cron szintaxisa a következő mintát követi:

* * * * * /elérési/út/a/szkripthez.sh
│ │ │ │ │
│ │ │ │ └── A hét napja (0=vasárnap, 6=szombat)
│ │ │ └──── Hónap (1–12)
│ │ └────── A hónap napja (1–31)
│ └──────── Óra (0–23)
└────────── Perc (0–59)

Íme néhány praktikus példa a három szkripthez:

# Rendszerfrissítés minden vasárnap hajnali 3-kor
0 3 * * 0 /home/felhasznaló/szkriptek/rendszer-frissites.sh >> /home/felhasznaló/naplók/frissites.log 2>&1

# Dokumentumok mentése minden nap este 11-kor
0 23 * * * /home/felhasznaló/szkriptek/mentes.sh >> /home/felhasznaló/naplók/mentes.log 2>&1

# Lemezterület ellenőrzése óránként
0 * * * * /home/felhasznaló/szkriptek/lemez-figyelő.sh

Fontos: A cron feladatok minimális környezetben futnak, a szokásos $PATH nélkül. Mindig teljes elérési utakat használj a szkriptekhez és parancsokhoz. A felhasznaló helyére írd a saját felhasználóneved (ellenőrizd a whoami paranccsal).

Hozd létre előbb a naplómappát:

mkdir -p ~/naplók

A crontab mentése után ellenőrizd, hogy regisztrálva van-e:

crontab -l

4. szkript: Git tárolók gyors állapotellenőrzője

A probléma: Több Git tárolóval dolgozol egyszerre, és mindig elfelejted, melyikben vannak nem commitolt változások.

nano ~/szkriptek/git-statusz.sh
#!/bin/bash

# Add meg a tároló elérési útjait
TÁROLÓK=(
    "$HOME/projektek/weboldal"
    "$HOME/projektek/dotfiles"
    "$HOME/projektek/szkriptek"
)

echo "=== Git tárolók állapotellenőrzése ==="
echo ""

for TÁROLÓ in "${TÁROLÓK[@]}"; do
    if [ -d "$TÁROLÓ/.git" ]; then
        echo "📁 $TÁROLÓ"
        cd "$TÁROLÓ"

        # Nem commitolt változások ellenőrzése
        if ! git diff-index --quiet HEAD --; then
            echo "   ⚠️  Nem commitolt változások vannak"
            git status --short
        else
            echo "   ✓  Tiszta"
        fi

        # Lemaradt-e a remote mögött?
        git fetch --quiet 2>/dev/null
        LEMARADT=$(git rev-list HEAD..@{u} --count 2>/dev/null)
        if [ "$LEMARADT" -gt 0 ] 2>/dev/null; then
            echo "   ↓  $LEMARADT commit(tal) lemaradt a remote mögött"
        fi

        echo ""
    else
        echo "⚠️  $TÁROLÓ — nem Git tároló, vagy nem létezik"
        echo ""
    fi
done

Szerkeszd a TÁROLÓK tömböt a saját projektek elérési útjaira, majd:

chmod +x ~/szkriptek/git-statusz.sh
./szkriptek/git-statusz.sh

Szkriptek rendszerezése hosszú távra

Ahogy a gyűjteményed bővül, tartsd rendben a dolgokat:

mkdir -p ~/.local/bin

Helyezd a szkripteket ide, és a terminál bármely pontjáról elérhetők lesznek (feltéve, hogy a ~/.local/bin benne van a $PATH-odban, ami a legtöbb modern disztrón alapértelmezés szerint igaz).

mv ~/szkriptek/*.sh ~/.local/bin/
# A .sh kiterjesztés eltávolítása tisztább parancsokhoz
mv ~/.local/bin/rendszer-frissites.sh ~/.local/bin/rendszer-frissites
chmod +x ~/.local/bin/rendszer-frissites

Mostantól bárhonnan begépelheted: rendszer-frissites.


Hibakeresési tippek

Ha egy szkript nem a várt módon működik, ez a két eszköz az első bevetésed:

1. Futtasd -x kapcsolóval a végrehajtás nyomkövetéséhez:

bash -x ./sajatszkript.sh

Ez minden parancsot kiír futtatás közben, a tényleges értékekkel helyettesítve. Felbecsülhetetlen értékű.

2. Adj hozzá set -e-t a szkript elejéhez:

#!/bin/bash
set -e

Ez azonnal kilépésre kényszeríti a szkriptet, ha bármely parancs hibával zárul, ahelyett, hogy csendben folytatná — és nehezen nyomozható problémákat hozna létre.


Mit próbálj ki ezután?

Ha már otthonosan mozogsz ezekben a mintákban, a logikus következő lépések:

  • Függvények — kódblokkokat használhatsz újra egy szkripten belül ismétlés nélkül
  • getopts — kapcsolókat és argumentumokat fogadhatsz el, ahogy az igazi Linux parancsok teszik (sajatszkript -v -o kimenet.txt)
  • systemd timerek — egy robusztusabb, modern alternatíva a cronhoz ütemezett feladatokhoz
  • flock — megakadályozza, hogy egy szkript egyszerre kétszer fusson, ami fontos az átfedő cron feladatoknál

A Bash szkriptelésnek híre van, hogy kriptikus, de ahogy itt is láthatod, az építőelemek aprók és olvashatók. Minden megírt szkript gyorsabbá teszi a következőt. Az igazi készség abban rejlik, hogy felismerd: melyik napi feladatod ér meg 30 perc automatizálást — és általában a válasz az: több, mint gondolnád.

 

Van egy feladat, amelyet automatizálnál, de nem tudod, hogyan kezdj hozzá? Írd meg a hozzászólásokban — minden kommentet elolvasunk.

Hozzászólások(0)

A hozzászóláshoz be kell jelentkezned.

Bejelentkezeés