Gym
lesson

Pozadinski procesi

Kada pokreneš komandu u terminalu, shell čeka da se završi pre nego što ti vrati prompt. To je pokretanje u prvom planu (foreground). Međutim, ponekad hoćeš da program radi u pozadini dok ti nastavljaš sa radom — tu dolazi do izražaja pokretanje u pozadini (background).

Operator & — pokretanje u pozadini

Dodavanjem znaka & na kraju komande, pokrećeš je u pozadini:

komanda &

Shell odmah vraća prompt, a program nastavlja da radi. Ispisuje se broj posla i PID:

sleep 100 &
# [1] 1234
  • [1] — broj posla (job number) u ovoj sesiji
  • 1234 — PID procesa

Možeš pokrenuti više procesa u pozadini odjednom:

wget https://primer.com/fajl1.zip &
wget https://primer.com/fajl2.zip &

Komanda jobs — lista poslova

jobs prikazuje sve procese koji su pokrenuti u pozadini ili pauzirani u trenutnoj sesiji:

jobs
[1]-  Running    sleep 100 &
[2]+  Stopped    nano dokument.txt
Simbol Značenje
+ Trenutni (podrazumevani) posao
- Prethodni posao
broj u zagradama Broj posla

Komanda fg — vrati u prvi plan

fg (foreground) vraća posao iz pozadine ili pauze u prvi plan:

fg         # Vraća podrazumevani (poslednji) posao
fg %1      # Vraća posao broj 1
fg %2      # Vraća posao broj 2

Nakon fg, program ponovo zauzima terminal i moraš sačekati da se završi (ili ga pauzirati/prekinuti).

Ctrl+Z i komanda bg

Dok je program u prvom planu, pritiskom na Ctrl+Z ga pauziraš i vraćaš se u shell:

nano dokument.txt
# ... editovanje ...
# [Ctrl+Z]
# [1]+  Stopped    nano dokument.txt

Nakon pauze, možeš ga nastaviti u pozadini komandom bg:

bg         # Nastavi podrazumevani pauziran posao u pozadini
bg %1      # Nastavi posao broj 1 u pozadini

Tok rada

pokretanje programa  -->  Ctrl+Z  -->  bg  -->  radi u pozadini
                                   -->  fg  -->  vraća se u prvi plan

Komanda nohup — preživljavanje logout-a

Problem sa pozadinskim procesima je što su vezani za sesiju terminala. Kad zatvoriš terminal, sistem šalje SIGHUP signal svim procesima koje si pokrenuo iz tog terminala — oni se gase.

nohup (no hang up) blokira taj signal — proces može da nastavi da radi čak i nakon logout-a:

nohup komanda &

Standardni izlaz se preusmerava u fajl nohup.out u trenutnom direktorijumu:

nohup python3 skript.py &
# [1] 2345
# nohup: ignoring input and appending output to 'nohup.out'

Da izlaz preusmeris na drugi fajl:

nohup python3 skript.py > moj_log.txt 2>&1 &
# ↑ > moj_log.txt   — standardni izlaz ide u fajl
# ↑ 2>&1            — greske (stderr) se preusmeravaju na isti izlaz
# ↑ &               — pokreni u pozadini

Napomena: nohup sam po sebi ne prikazuje napredak — korisno je preusmeriti izlaz u log fajl koji možeš pratiti sa tail -f.

screen i tmux — alternativni shell sa persistentnim sesijama

screen i tmux su multiplekseri terminala — alati koji kreiraju virtuelne terminalne sesije. Možeš se odjaviti, a sesija i svi procesi u njoj nastavljaju da rade. Kada se vratiš, ponovo se prikačiš i vidiš sve kao da nisi ni otišao.

Osnovna upotreba (screen):

screen           # Pokreni novu sesiju
# ... radiš nešto ...
# Ctrl+A, zatim d  — odkvači se (sesija ostaje aktivna u pozadini)
screen -r        # Vrati se na sesiju

tmux je modernija alternativa sa istim principom rada (Ctrl+B d za odkvačivanje, tmux attach za povratak). Na produkcijskim serverima je tmux danas češći izbor.

Preporuka: Za kratke zadatke koji ne zahtevaju interakciju, nohup & je dovoljan. Za duže sesije, naročito na udaljenim serverima, koristi tmux.