Linux - Pytania Rekrutacyjne dla DevOps i Backend Developera [2026]

Sławomir Plamowski 21 min czytania
administracja backend bash devops linux pytania-rekrutacyjne shell

Przygotowujesz się do rozmowy na stanowisko DevOps Engineer lub Backend Developer? Linux to fundament - nawet jeśli rozwijasz kod na macOS czy Windows, Twoje aplikacje prawie na pewno działają na serwerach Linux. Rekruterzy oczekują, że swobodnie poruszasz się po terminalu, debugujesz problemy i automatyzujesz zadania.

Ten przewodnik zawiera 50+ pytań rekrutacyjnych z odpowiedziami - od podstawowych komend po zaawansowany bash scripting i administrację systemem.

Spis treści


Nawigacja i system plików

Jakie są podstawowe komendy do nawigacji w Linux?

Odpowiedź w 30 sekund: Podstawowe komendy to pwd (gdzie jestem), cd (zmień katalog), ls (lista plików). Rekruterzy oczekują płynności - nie zastanawiania się nad podstawami.

Odpowiedź w 2 minuty:

Najlepiej pokazać to na praktycznych przykładach komend, które używasz codziennie w pracy.

# Nawigacja
pwd                     # Print working directory - gdzie jestem
cd /path/to/dir         # Change directory - przejdź do katalogu
cd ..                   # Katalog wyżej
cd ~                    # Katalog domowy
cd -                    # Poprzedni katalog (bardzo użyteczne!)

# Wyświetlanie plików
ls                      # Lista plików
ls -la                  # Long format + ukryte pliki
ls -lh                  # Human-readable rozmiary (KB, MB, GB)
ls -lt                  # Sortuj po czasie modyfikacji
ls -lS                  # Sortuj po rozmiarze

# Informacje o plikach
file document.pdf       # Typ pliku
stat file.txt           # Szczegółowe informacje
wc -l file.txt          # Liczba linii

Wyjaśnij strukturę katalogów Linux

Odpowiedź w 30 sekund: Wszystko zaczyna się od / (root). Kluczowe katalogi: /etc (konfiguracja), /var (logi, dane), /home (użytkownicy), /usr (programy), /tmp (tymczasowe).

Odpowiedź w 2 minuty:

Struktura katalogów w Linux jest hierarchiczna i zhierarchizowana - warto znać kluczowe lokalizacje.

Katalog Zawartość Przykłady
/ Root filesystem Punkt startowy
/etc Konfiguracja systemowa nginx.conf, passwd
/var Zmienne dane /var/log, /var/www
/home Katalogi użytkowników /home/jan
/usr Programy i biblioteki /usr/bin, /usr/lib
/tmp Pliki tymczasowe Czyszczone przy reboot
/opt Oprogramowanie zewnętrzne /opt/myapp
/proc Wirtualny filesystem /proc/cpuinfo
/dev Urządzenia /dev/sda, /dev/null
# Szybkie sprawdzenie kluczowych lokalizacji
cat /etc/os-release     # Informacje o dystrybucji
ls /var/log/            # Logi systemowe
df -h                   # Zamontowane systemy plików

Odpowiedź w 30 sekund: Hard link to dodatkowa nazwa dla tego samego pliku (tego samego inode). Symbolic link to wskaźnik na ścieżkę - jak skrót w Windows. Usunięcie oryginału psuje symlink, ale nie hard link.

Odpowiedź w 2 minuty:

Różnice najlepiej przedstawić w formie porównania kluczowych cech i zachowań obu typów linków.

Cecha Hard Link Symbolic Link
Wskazuje na Inode (dane pliku) Ścieżkę (nazwę pliku)
Po usunięciu oryginału Działa dalej Psuje się (dangling)
Między systemami plików Nie Tak
Dla katalogów Nie Tak
Rozmiar Taki sam jak oryginał Rozmiar ścieżki
# Tworzenie linków
ln plik.txt hardlink.txt        # Hard link
ln -s plik.txt symlink.txt      # Symbolic link

# Sprawdzenie
ls -li                          # -i pokazuje inode
# Hard link ma TEN SAM inode co oryginał
# Symlink ma WŁASNY inode i wskazuje na ścieżkę

# Znajdowanie broken symlinks
find /path -xtype l             # Znajduje dangling symlinks

Na co zwracają uwagę rekruterzy: Czy rozumiesz różnicę na poziomie inode, nie tylko "jeden działa po usunięciu, drugi nie".


Uprawnienia i własność plików

Jak działają uprawnienia plików w Linux?

Odpowiedź w 30 sekund: Trzy zestawy uprawnień (owner, group, others), każdy z trzema typami (read, write, execute). Zapis numeryczny: r=4, w=2, x=1. Więc 755 to rwx dla właściciela, rx dla reszty.

Odpowiedź w 2 minuty:

System uprawnień Linux opiera się na trzech grupach i trzech typach dostępu - zobaczmy jak to wygląda w praktyce.

# ls -l pokazuje uprawnienia
-rwxr-xr-x 1 jan developers 4096 Jan 1 10:00 script.sh
│└┬┘└┬┘└┬┘
│ │  │  └── others (inni)
│ │  └───── group (grupa)
│ └──────── owner (właściciel)
└────────── typ pliku (- = plik, d = katalog, l = link)
Symbol Wartość Znaczenie dla pliku Znaczenie dla katalogu
r 4 Odczyt zawartości Lista plików (ls)
w 2 Zapis/modyfikacja Tworzenie/usuwanie plików
x 1 Wykonanie Wejście do katalogu (cd)
# Zmiana uprawnień
chmod 755 script.sh         # rwxr-xr-x (właściciel wszystko, reszta rx)
chmod 644 config.txt        # rw-r--r-- (właściciel rw, reszta tylko r)
chmod +x script.sh          # Dodaj execute dla wszystkich
chmod u+x script.sh         # Dodaj execute tylko dla właściciela
chmod g-w file.txt          # Usuń write dla grupy
chmod -R 755 directory/     # Rekursywnie

# Zmiana właściciela
chown jan:developers file.txt    # Właściciel i grupa
chown jan file.txt               # Tylko właściciel
chown :developers file.txt       # Tylko grupa
chown -R www-data:www-data /var/www/   # Rekursywnie

Co to jest SUID, SGID i Sticky Bit?

Odpowiedź w 30 sekund: SUID (4xxx) - program działa z uprawnieniami właściciela pliku (np. passwd). SGID (2xxx) - program działa z uprawnieniami grupy lub nowe pliki dziedziczą grupę katalogu. Sticky bit (1xxx) - tylko właściciel może usuwać pliki (np. /tmp).

Odpowiedź w 2 minuty:

Te specjalne uprawnienia pozwalają na zaawansowaną kontrolę dostępu - oto jak działają w praktyce.

# SUID - Set User ID (4xxx)
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ...
#   ^-- 's' zamiast 'x' = SUID włączony
# passwd może modyfikować /etc/shadow mimo że uruchamia go zwykły user

# SGID - Set Group ID (2xxx)
chmod 2755 /shared/project/
# Nowe pliki w tym katalogu dziedziczą grupę katalogu, nie użytkownika

# Sticky Bit (1xxx)
ls -ld /tmp
drwxrwxrwt 10 root root ...
#        ^-- 't' = sticky bit
# Każdy może pisać do /tmp, ale tylko właściciel może usuwać swoje pliki

# Ustawianie
chmod 4755 program         # SUID
chmod 2755 directory       # SGID
chmod 1777 /shared/tmp     # Sticky bit
chmod u+s program          # SUID symbolicznie

Typowe pytanie follow-up: "Dlaczego SUID na skryptach jest niebezpieczny?"

  • Skrypty mogą być łatwo zmodyfikowane lub manipulowane przez zmienne środowiskowe
  • Kernel ignoruje SUID na skryptach w większości systemów

Czym jest umask i jak działa?

Odpowiedź w 30 sekund: Umask określa domyślne uprawnienia dla nowych plików przez "maskowanie" bitów. Domyślne uprawnienia (666 dla plików, 777 dla katalogów) minus umask = rzeczywiste uprawnienia. Umask 022 daje pliki 644 i katalogi 755.

Odpowiedź w 2 minuty:

Umask działa przez odejmowanie bitów od domyślnych uprawnień - najlepiej to pokazać na przykładach.

# Sprawdzenie aktualnego umask
umask              # np. 0022
umask -S           # symbolic: u=rwx,g=rx,o=rx

# Jak działa:
# Pliki: 666 (domyślne) - 022 (umask) = 644 (rw-r--r--)
# Katalogi: 777 (domyślne) - 022 (umask) = 755 (rwxr-xr-x)

# Ustawienie restrykcyjnego umask
umask 077          # Tylko właściciel ma dostęp (600/700)

# Typowe wartości umask
# 022 - standardowa (rw-r--r-- dla plików)
# 027 - bez dostępu dla others
# 077 - tylko właściciel

Zarządzanie procesami

Jak sprawdzić działające procesy?

Odpowiedź w 30 sekund: ps aux pokazuje wszystkie procesy. top lub htop dla live view. pgrep do szukania po nazwie. Kluczowe kolumny: PID, USER, %CPU, %MEM, COMMAND.

Odpowiedź w 2 minuty:

Istnieje kilka sposobów na sprawdzenie procesów - każdy przydatny w innych sytuacjach.

# Podstawowe komendy
ps aux                      # Wszystkie procesy (BSD syntax)
ps -ef                      # Wszystkie procesy (POSIX syntax)
ps aux | grep nginx         # Filtruj po nazwie
pgrep -a nginx              # PID i komenda procesów nginx
pgrep -u jan                # Procesy użytkownika jan

# Live monitoring
top                         # Klasyczny monitor
htop                        # Lepszy interfejs (jeśli zainstalowany)
watch -n 1 'ps aux | head'  # Odświeżaj co sekundę

# Szczegóły procesu
ps -p 1234 -o pid,ppid,cmd,%cpu,%mem    # Wybrane kolumny
cat /proc/1234/status       # Wszystko o procesie 1234
ls -l /proc/1234/fd         # Otwarte file descriptors

Kolumny ps aux:

Kolumna Znaczenie
PID Process ID
PPID Parent Process ID
USER Właściciel procesu
%CPU Użycie CPU
%MEM Użycie pamięci
VSZ Virtual memory size
RSS Resident Set Size (fizyczna pamięć)
STAT Status (R=running, S=sleeping, Z=zombie)
COMMAND Komenda uruchamiająca proces

Jak zabić proces?

Odpowiedź w 30 sekund: kill PID wysyła SIGTERM (graceful shutdown). kill -9 PID wysyła SIGKILL (natychmiastowe zabicie). pkill nazwa zabija po nazwie. Zawsze próbuj SIGTERM przed SIGKILL.

Odpowiedź w 2 minuty:

Zabijanie procesów to coś więcej niż tylko kill -9 - poznaj różne sygnały i ich zastosowania.

# Graceful shutdown (SIGTERM = 15)
kill 1234                   # Domyślnie SIGTERM
kill -15 1234               # Jawnie SIGTERM
kill -TERM 1234             # Lub po nazwie

# Force kill (SIGKILL = 9) - ostateczność!
kill -9 1234                # Proces nie może tego zignorować
kill -KILL 1234

# Po nazwie
pkill nginx                 # SIGTERM do wszystkich procesów nginx
pkill -9 nginx              # SIGKILL
killall nginx               # Podobne do pkill

# Wszystkie procesy użytkownika
pkill -u username

# Proces na porcie
lsof -i :8080               # Znajdź proces na porcie
fuser -k 8080/tcp           # Zabij proces na porcie

Najważniejsze sygnały:

Sygnał Numer Znaczenie
SIGTERM 15 Graceful shutdown (domyślny)
SIGKILL 9 Natychmiastowe zabicie (nie można zignorować)
SIGHUP 1 Hangup - często reload konfiguracji
SIGINT 2 Interrupt (Ctrl+C)
SIGSTOP 19 Zatrzymaj proces
SIGCONT 18 Wznów zatrzymany proces

Na co zwracają uwagę rekruterzy: "Dlaczego nie zawsze używać kill -9?" - Proces nie ma szansy na cleanup (zamknięcie plików, zwolnienie zasobów, zapisanie stanu).

Co to jest zombie process i jak się go pozbyć?

Odpowiedź w 30 sekund: Zombie to proces, który zakończył działanie, ale jego parent nie odebrał exit code (nie wywołał wait()). Nie zużywa zasobów oprócz wpisu w tabeli procesów. Nie można go zabić - trzeba zabić parenta lub poczekać aż parent wywoła wait().

Odpowiedź w 2 minuty:

Zombie procesy wyglądają specyficznie w systemie - oto jak je zidentyfikować i obsłużyć.

# Znajdowanie zombie
ps aux | grep 'Z'           # Status 'Z' = zombie
ps aux | awk '$8=="Z"'      # Tylko zombie

# Zombie wygląda tak:
# USER  PID  PPID  STAT  COMMAND
# jan   1234 5678  Z     [defunct]

# Sprawdzenie parenta
ps -o ppid= -p 1234         # PPID zombie
ps -p 5678                  # Info o parent

# "Rozwiązania"
# 1. Zabij parent process - zombie znikną (adoptowane przez init)
kill -9 5678

# 2. Jeśli parent to ważny proces - napraw kod
#    Parent musi wywołać wait() lub waitpid()

# 3. Poczekaj - init (PID 1) adoptuje i czyści orphans

Orphan vs Zombie:

  • Orphan - parent umarł, proces adoptowany przez init (PID 1)
  • Zombie - proces umarł, parent nie odebrał exit status

Wyszukiwanie i filtrowanie

Jak wyszukiwać tekst w plikach?

Odpowiedź w 30 sekund: grep to podstawowe narzędzie. grep -r pattern dir/ szuka rekursywnie. grep -i ignoruje wielkość liter. grep -n pokazuje numery linii. grep -v odwraca dopasowanie.

Odpowiedź w 2 minuty:

Grep to najważniejsze narzędzie do wyszukiwania tekstu - oto najczęściej używane opcje i wzorce.

# Podstawowe użycie
grep "ERROR" logfile.txt              # Znajdź linie z ERROR
grep -i "error" logfile.txt           # Case insensitive
grep -n "error" logfile.txt           # Z numerami linii
grep -c "error" logfile.txt           # Tylko liczba dopasowań
grep -v "DEBUG" logfile.txt           # Linie BEZ DEBUG

# Rekursywne szukanie
grep -r "TODO" src/                   # W katalogu src/
grep -rn "TODO" src/                  # Z numerami linii
grep -rl "TODO" src/                  # Tylko nazwy plików

# Regex
grep -E "error|warning" log.txt       # Extended regex (OR)
grep "^Start" log.txt                 # Linie zaczynające się od "Start"
grep "end$" log.txt                   # Linie kończące się na "end"
grep -E "[0-9]{3}" log.txt            # 3 cyfry pod rząd

# Kontekst
grep -A 3 "ERROR" log.txt             # 3 linie po dopasowaniu (After)
grep -B 3 "ERROR" log.txt             # 3 linie przed (Before)
grep -C 3 "ERROR" log.txt             # 3 linie przed i po (Context)

# Z innymi komendami
cat access.log | grep "404"
ps aux | grep nginx | grep -v grep

Jak wyszukiwać pliki?

Odpowiedź w 30 sekund: find to potężne narzędzie do szukania plików. find /path -name "*.log" szuka po nazwie. find . -type f -mtime -7 znajduje pliki zmodyfikowane w ostatnich 7 dniach. locate jest szybsze ale wymaga aktualizacji bazy.

Odpowiedź w 2 minuty:

Find oferuje potężne możliwości wyszukiwania po różnych kryteriach - nazwie, rozmiarze, czasie, uprawnieniach.

# Po nazwie
find /var/log -name "*.log"           # Dokładna nazwa
find . -iname "*.txt"                 # Case insensitive
find . -name "test*"                  # Zaczyna się od "test"

# Po typie
find . -type f                        # Tylko pliki
find . -type d                        # Tylko katalogi
find . -type l                        # Symlinks

# Po rozmiarze
find . -size +100M                    # Większe niż 100MB
find . -size -1k                      # Mniejsze niż 1KB
find . -empty                         # Puste pliki/katalogi

# Po czasie
find . -mtime -7                      # Zmodyfikowane w ostatnich 7 dniach
find . -mtime +30                     # Zmodyfikowane ponad 30 dni temu
find . -mmin -60                      # Zmodyfikowane w ostatniej godzinie
find . -newer reference.txt           # Nowsze niż reference.txt

# Po uprawnieniach
find . -perm 755                      # Dokładnie 755
find . -perm -u+x                     # Executable dla owner

# Wykonanie akcji
find . -name "*.tmp" -delete          # Usuń znalezione
find . -name "*.sh" -exec chmod +x {} \;    # Wykonaj komendę
find . -type f -exec grep -l "TODO" {} \;   # Grep w znalezionych

# Kombinacje
find /var/log -name "*.log" -size +10M -mtime +7
# Logi większe niż 10MB, starsze niż 7 dni

locate vs find:

# locate - szybki (używa bazy danych)
locate nginx.conf
sudo updatedb                 # Aktualizuj bazę locate

# find - wolniejszy ale real-time
find / -name "nginx.conf"

Jak używać pipes i redirection?

Odpowiedź w 30 sekund: Pipe | przekazuje stdout jednej komendy jako stdin następnej. > nadpisuje plik, >> dopisuje. 2> przekierowuje stderr. 2>&1 łączy stderr ze stdout.

Odpowiedź w 2 minuty:

Pipes i redirection to fundament pracy w terminalu - pozwalają łączyć proste komendy w potężne operacje.

# Pipes - łączenie komend
cat file.txt | grep "error" | wc -l
ps aux | grep nginx | awk '{print $2}'
ls -la | sort -k5 -n | tail -10      # 10 największych plików

# Redirection - do pliku
echo "hello" > file.txt              # Nadpisz
echo "world" >> file.txt             # Dopisz
command 2> errors.log                # Tylko stderr do pliku
command > output.log 2>&1            # stdout i stderr do pliku
command &> all.log                   # To samo (bash shortcut)

# Ważne: kolejność ma znaczenie!
command > file 2>&1                  # OK - stderr idzie gdzie stdout
command 2>&1 > file                  # ŹLE - stderr idzie na terminal

# /dev/null - czarna dziura
command > /dev/null                  # Ignoruj stdout
command 2> /dev/null                 # Ignoruj stderr
command &> /dev/null                 # Ignoruj wszystko

# Here document
cat << EOF > config.txt
line 1
line 2
EOF

# Here string
grep "pattern" <<< "text to search"

Typowe kombinacje:

# Logi - ostatnie błędy
tail -f /var/log/syslog | grep -i error

# Top 10 procesów po pamięci
ps aux | sort -k4 -rn | head -10

# Unikalne IP z access loga
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn

# Znajdź duże pliki i posortuj
find . -type f -exec du -h {} + | sort -rh | head -20

Sieć i połączenia

Jak sprawdzić otwarte porty i połączenia?

Odpowiedź w 30 sekund: ss -tulpn lub netstat -tulpn pokazuje listening ports. lsof -i :port pokazuje proces na porcie. nc -zv host port testuje połączenie.

Odpowiedź w 2 minuty:

Do sprawdzania portów i połączeń używamy głównie ss (nowoczesne) lub netstat (klasyczne).

# Listening ports
ss -tulpn                    # Nowoczesne (zastępuje netstat)
netstat -tulpn               # Klasyczne
# -t TCP, -u UDP, -l listening, -p process, -n numeric

# Wszystkie połączenia
ss -tan                      # TCP wszystkie, numeric
ss state established         # Tylko ustanowione

# Proces na porcie
lsof -i :8080                # Co słucha na 8080?
fuser 8080/tcp               # PID procesu na porcie

# Testowanie połączeń
nc -zv localhost 8080        # Test czy port otwarty
telnet localhost 8080        # Interaktywne połączenie
curl -I http://localhost     # HTTP test

# DNS
dig example.com              # DNS lookup
nslookup example.com         # Starszy odpowiednik
host example.com             # Prosty lookup

# Routing i interfejsy
ip addr                      # Interfejsy sieciowe
ip route                     # Tablica routingu
ping -c 4 google.com         # Test connectivity
traceroute google.com        # Śledzenie trasy
mtr google.com               # Kombinacja ping + traceroute

Jak debugować problemy sieciowe?

Odpowiedź w 30 sekund: Sprawdź kolejno: 1) IP i interfejs (ip addr), 2) Gateway (ip route), 3) DNS (dig), 4) Połączenie (ping, curl), 5) Firewall (iptables -L). Użyj tcpdump do analizy pakietów.

Odpowiedź w 2 minuty:

Debugowanie sieci to systematyczne przechodzenie przez warstwy OSI - od interfejsu przez routing po DNS i aplikację.

# 1. Czy mam IP?
ip addr show
ip link show                 # Status interfejsów

# 2. Czy mam routing?
ip route
# default via 192.168.1.1 dev eth0

# 3. Czy DNS działa?
cat /etc/resolv.conf
dig google.com
dig @8.8.8.8 google.com      # Użyj konkretnego DNS

# 4. Czy mogę pingować?
ping -c 4 8.8.8.8            # IP (omija DNS)
ping -c 4 google.com         # Domain (testuje DNS)

# 5. Czy usługa odpowiada?
curl -v http://localhost:8080
telnet localhost 8080

# 6. Firewall?
sudo iptables -L -n          # Lista reguł
sudo ufw status              # Ubuntu firewall

# 7. Analiza pakietów
sudo tcpdump -i eth0 port 80
sudo tcpdump -i any host 192.168.1.1
tcpdump -w capture.pcap      # Zapisz do pliku

Typowe problemy i rozwiązania:

Problem Diagnoza Rozwiązanie
Brak IP ip addr shows no IP dhclient eth0
Brak gateway ip route empty ip route add default via X
DNS nie działa dig fails Sprawdź /etc/resolv.conf
Port zamknięty nc timeout Sprawdź firewall, usługę
Połączenie timeout ping ok, curl fail Sprawdź aplikację, port

Bash scripting

Jak napisać podstawowy skrypt bash?

Odpowiedź w 30 sekund: Zacznij od shebang #!/bin/bash. Używaj set -euo pipefail dla bezpieczeństwa. Zmienne: VAR="value", użycie: $VAR lub ${VAR}. Argumenty: $1, $2, $@ (wszystkie), $# (liczba).

Odpowiedź w 2 minuty:

Dobry skrypt bash zaczyna się od shebang i bezpiecznych ustawień - oto podstawowy szablon z najważniejszymi elementami.

#!/bin/bash
set -euo pipefail   # Exit on error, undefined vars, pipe failures

# Zmienne
NAME="Jan"
echo "Hello, $NAME"
echo "Hello, ${NAME}!"   # Bezpieczniejsza forma

# Argumenty
echo "Script name: $0"
echo "First arg: $1"
echo "All args: $@"
echo "Arg count: $#"

# Warunki
if [ "$1" == "hello" ]; then
    echo "Hi there!"
elif [ -z "$1" ]; then
    echo "No argument provided"
else
    echo "Unknown: $1"
fi

# Test operatory
[ -f file.txt ]     # Plik istnieje
[ -d dir/ ]         # Katalog istnieje
[ -z "$VAR" ]       # String pusty
[ -n "$VAR" ]       # String niepusty
[ "$A" == "$B" ]    # Stringi równe
[ "$A" -eq "$B" ]   # Liczby równe
[ "$A" -gt "$B" ]   # A > B (greater than)

# Pętle
for file in *.txt; do
    echo "Processing $file"
done

for i in {1..5}; do
    echo "Number $i"
done

while read -r line; do
    echo "Line: $line"
done < input.txt

# Funkcje
greet() {
    local name="$1"
    echo "Hello, $name"
}
greet "Jan"

# Command substitution
DATE=$(date +%Y-%m-%d)
FILES=$(ls *.txt)

Napisz skrypt do backupu z rotacją

Odpowiedź w 2 minuty:

Oto praktyczny przykład skryptu backupowego z rotacją starych kopii - można go używać w cronie.

#!/bin/bash
set -euo pipefail

# Konfiguracja
BACKUP_DIR="/backups"
SOURCE_DIR="/var/www"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${DATE}.tar.gz"

# Tworzenie backupu
echo "Starting backup..."
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}" "$SOURCE_DIR"

if [ $? -eq 0 ]; then
    echo "Backup created: ${BACKUP_NAME}"
else
    echo "Backup failed!" >&2
    exit 1
fi

# Rotacja - usuwanie starych backupów
echo "Cleaning old backups..."
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete

# Raport
BACKUP_SIZE=$(du -h "${BACKUP_DIR}/${BACKUP_NAME}" | cut -f1)
TOTAL_BACKUPS=$(ls -1 "${BACKUP_DIR}"/backup_*.tar.gz 2>/dev/null | wc -l)
echo "Backup size: $BACKUP_SIZE"
echo "Total backups: $TOTAL_BACKUPS"

Co znaczy set -euo pipefail?

Odpowiedź w 30 sekund: set -e kończy skrypt przy pierwszym błędzie. set -u traktuje niezdefiniowane zmienne jako błąd. set -o pipefail zwraca błąd jeśli którakolwiek komenda w pipe zwróci błąd, nie tylko ostatnia.

Odpowiedź w 2 minuty:

Każda z tych opcji zabezpiecza skrypt przed innym typem błędu - najlepiej pokazać różnicę na przykładach.

# Bez set -e - skrypt kontynuuje mimo błędów
#!/bin/bash
rm /nonexistent/file     # Błąd, ale idzie dalej
echo "This still runs"   # Niebezpieczne!

# Z set -e - skrypt kończy się przy błędzie
#!/bin/bash
set -e
rm /nonexistent/file     # Błąd
echo "This won't run"    # Skrypt już zakończony

# set -u - niezdefiniowane zmienne to błąd
set -u
echo $UNDEFINED_VAR      # Błąd! (bez -u: pusta wartość)

# set -o pipefail - błąd w pipe
# Bez pipefail:
false | true             # Exit code: 0 (ostatnia komenda)

# Z pipefail:
set -o pipefail
false | true             # Exit code: 1 (pierwsza komenda)

# Typowe bezpieczne rozpoczęcie skryptu
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'              # Bezpieczniejszy IFS

Zarządzanie usługami

Jak zarządzać usługami systemowymi?

Odpowiedź w 30 sekund: Systemd jest standardem. systemctl start/stop/restart service kontroluje usługi. systemctl enable/disable zarządza autostartem. systemctl status pokazuje stan. journalctl do logów.

Odpowiedź w 2 minuty:

Systemd to standardowy system zarządzania usługami w nowoczesnych dystrybucjach - oto podstawowe komendy.

# Kontrola usług
systemctl start nginx      # Uruchom
systemctl stop nginx       # Zatrzymaj
systemctl restart nginx    # Restart
systemctl reload nginx     # Reload konfiguracji (bez restartu)

# Status
systemctl status nginx     # Szczegółowy status
systemctl is-active nginx  # Tylko active/inactive
systemctl is-enabled nginx # Czy autostart włączony

# Autostart
systemctl enable nginx     # Włącz autostart
systemctl disable nginx    # Wyłącz autostart
systemctl enable --now nginx  # Enable + start

# Lista usług
systemctl list-units --type=service              # Aktywne
systemctl list-units --type=service --all        # Wszystkie
systemctl list-unit-files --type=service         # Pliki jednostek

# Logi (journalctl)
journalctl -u nginx                # Logi nginx
journalctl -u nginx -f             # Follow (jak tail -f)
journalctl -u nginx --since today  # Od dzisiaj
journalctl -u nginx -n 100         # Ostatnie 100 linii
journalctl -u nginx -p err         # Tylko błędy

# Tworzenie własnej usługi
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

# Po utworzeniu
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp

Dyski i pamięć

Jak sprawdzić wykorzystanie dysku i pamięci?

Odpowiedź w 30 sekund: df -h pokazuje wykorzystanie systemów plików. du -sh folder/ rozmiar katalogu. free -h pokazuje pamięć RAM i swap. top/htop dla live view.

Odpowiedź w 2 minuty:

Monitorowanie zasobów dyskowych i pamięci to kluczowa część administracji - oto najważniejsze komendy.

# Dyski - systemy plików
df -h                       # Human-readable
df -h /                     # Konkretny filesystem
df -i                       # Inodes (może się skończyć!)

# Rozmiar katalogów
du -sh /var/log             # Rozmiar katalogu
du -sh /var/*               # Rozmiar podkatalogów
du -h --max-depth=1 /var    # Jeden poziom głębokości
du -sh * | sort -rh | head  # Top 10 największych

# Znajdź duże pliki
find / -type f -size +100M -exec ls -lh {} \;
ncdu /                      # Interaktywny (jeśli zainstalowany)

# Pamięć RAM
free -h                     # Human-readable
free -m                     # W MB
# Ważne: "available" nie "free" - to rzeczywista dostępna pamięć

# Szczegóły pamięci
cat /proc/meminfo
vmstat 1                    # Live stats co sekundę

Interpretacja free:

              total        used        free      shared  buff/cache   available
Mem:           16Gi       4.2Gi       1.1Gi       312Mi        10Gi        11Gi
Swap:          8.0Gi          0B       8.0Gi
  • available (11Gi) - tyle pamięci może dostać nowy program
  • buff/cache (10Gi) - może być zwolnione w razie potrzeby
  • free (1.1Gi) - naprawdę nieużywane (marnowane!)

Jak zamontować i odmontować system plików?

Odpowiedź w 30 sekund: mount /dev/sdb1 /mnt/data montuje urządzenie. umount /mnt/data odmontowuje. /etc/fstab dla permanentnego montowania. lsblk pokazuje urządzenia blokowe.

Odpowiedź w 2 minuty:

Montowanie systemów plików wymaga zrozumienia urządzeń blokowych i punktów montowania - oto praktyczne przykłady.

# Lista urządzeń
lsblk                       # Urządzenia blokowe
fdisk -l                    # Partycje
blkid                       # UUID urządzeń

# Montowanie
mount /dev/sdb1 /mnt/usb                    # Podstawowe
mount -t ext4 /dev/sdb1 /mnt/data           # Z typem FS
mount -o ro /dev/sdb1 /mnt/data             # Read-only
mount -o remount,rw /mnt/data               # Przemontuj jako rw

# Odmontowanie
umount /mnt/usb
umount -l /mnt/usb          # Lazy unmount (jeśli busy)
fuser -m /mnt/usb           # Kto używa mount point?

# /etc/fstab - permanentne montowanie
# Format: <device> <mount point> <type> <options> <dump> <pass>
UUID=abc123 /data ext4 defaults 0 2
/dev/sdb1   /backup ext4 defaults,noatime 0 2

# Po edycji fstab
mount -a                    # Zamontuj wszystko z fstab
systemctl daemon-reload     # Systemd reload

# NFS mount
mount -t nfs server:/share /mnt/nfs
# W fstab:
server:/share /mnt/nfs nfs defaults 0 0

Zobacz też


Ten artykuł jest częścią serii przygotowującej do rozmów rekrutacyjnych na stanowisko DevOps Engineer. Opanuj Linux i inne technologie DevOps z naszymi fiszkami do nauki.

Chcesz więcej pytań rekrutacyjnych?

To tylko jeden temat z naszego kompletnego przewodnika po rozmowach rekrutacyjnych. Uzyskaj dostęp do 800+ pytań z 13 technologii.

Kup pełny dostęp Zobacz bezpłatny podgląd
Powrót do blogu

Zostaw komentarz

Pamiętaj, że komentarze muszą zostać zatwierdzone przed ich opublikowaniem.