Articole
    Home » Rulați scripturi în fundal cu nohup, wait și sleep
Rulați scripturi în fundal cu nohup, wait și sleep

Rulați scripturi în fundal cu nohup, wait și sleep

Despre ce e vorba?

Ai ajuns aici probabil pentru că ai avut nevoie să rulezi un script care durează, să-l lași să-și facă treaba în fundal și să nu depinzi de sesiunea ta de SSH sau de terminal. Asta e una din cele mai comune provocări când lucrezi cu servere (indiferent că e cloud, VPS, docker, sau server dedicat).

Aici discutăm despre nohup, wait și sleep: trei comenzi aparent banale, dar care, dacă știi să le combini, pot să-ți salveze zile întregi de nervi, crash-uri, procese orfane sau taskuri abandonate.

Situația dramatică: când serverul tău decide să ia o pauză

Imaginează-ți: rulezi un script de backup care durează 2 ore. Te conectezi prin SSH, pornești scriptul și… hopa! Internetul pică. Sau laptopul intră în sleep. Sau te sună cineva și uiți să ții sesiunea deschisă. Revii peste 2 ore: scriptul s-a oprit la 3%. Totul de refăcut.

De câte ori nu ai pățit-o? Când ai de administrat servere, timpul tău devine prețios și orice task automatizat e aur curat. Nu vrei să stai cu ochii pe terminal ca pe finala Champions League. Aici intră în scenă nohup, wait și sleep.

Problema pe care o rezolvi

  • Procesele lansate din terminal se opresc când sesiunea SSH cade
  • Nu poți lăsa scripturi să ruleze pe termen lung fără să-ți bați capul cu ele
  • Vrei să lansezi mai multe taskuri în paralel și să sincronizezi execuția lor
  • Ai nevoie să faci delay-uri inteligente sau să „paștezi” resursele serverului

Și, bonus: vrei să lași procese să ruleze chiar dacă ai ieșit din shell, fără să le pierzi, fără să te trezești cu procese zombie, fără să-ți blochezi sesiunea.

Cum funcționează nohup, wait și sleep?

nohup

Numele vine de la no hang up. Practic, când rulezi un script cu nohup, îi spui sistemului: „Dacă sesiunea de terminal moare, lasă procesul să continue!”.

În mod implicit, nohup redirecționează ieșirile (stdout și stderr) într-un fișier nohup.out, dacă nu specifici altceva.

sleep

Face exact ce zice pe cutie: „doarme” un număr de secunde, minute, ore sau zile. Îl folosești pentru a introduce pauze între comenzi sau pentru a temporiza execuția unor taskuri.

wait

Asta e șmecheria când lucrezi cu procese paralele. wait face ca scriptul tău să aștepte până când procesele copil (pornite în fundal) se termină.

Algoritm & structură

  • nohup → rulezi procesul independent de terminal
  • & (ampersand) → rulezi procesul în fundal
  • sleep → introduce delay-uri controlate
  • wait → sincronizează execuția scripturilor tale

Cazuri de utilizare: Arbore cu beneficii

  • Backup-uri automate → rulezi scripturi de backup noaptea, fără să te temi că sesiunea SSH pică
  • Actualizări pe servere → lansezi scripturi de update care durează ore, fără să stai cu frică
  • Procesare batch → pornești mai multe procese simultan, folosești wait ca să nu înceapă altele până nu se termină primele
  • Delay-uri între taskuri → cu sleep eviți supraîncărcarea serverului sau respectarea rate limiting-ului la API-uri
  • Orchestrare manuală → când nu ai chef să folosești un orchestrator complicat, poți face „mini-orchestrare” cu aceste comenzi

Setup rapid: Ghid pas cu pas

Pasul 1: Pregătește scriptul

Să zicem că ai un script long_task.sh. Pune-i permisiuni de execuție:

chmod +x long_task.sh

Pasul 2: Rulează cu nohup în fundal

nohup ./long_task.sh &

Asta îl lansează în fundal și îl face imun la deconectări.

Pasul 3: Verifică dacă rulează

ps aux | grep long_task.sh

Pasul 4: Folosește sleep pentru delay-uri

Vrei să rulezi două scripturi, dar să lași 30 de secunde între ele:

nohup ./task1.sh &
sleep 30
nohup ./task2.sh &

Pasul 5: Folosește wait pentru sincronizare

Rulezi mai multe taskuri în paralel și vrei să continui doar după ce s-au terminat toate:

nohup ./job1.sh &
nohup ./job2.sh &
nohup ./job3.sh &
wait
echo "Toate job-urile s-au terminat!"

Pasul 6: Redirecționează outputul acolo unde vrei tu

Nu vrei să-ți umpli folderul cu nohup.out? Fă redirect explicit:

nohup ./long_task.sh > output.log 2>&1 &

Pasul 7: Dezactivează complet inputul

Dacă scriptul tău cere input, dar vrei să ruleze 100% fără interacțiune:

nohup ./long_task.sh < /dev/null > output.log 2>&1 &

Mini Glosar cu definiții reale

  • nohup: „Lasă-mă să fac ce vreau, chiar dacă tu ai plecat!”
  • sleep: „Fac o pauză, nu mă deranja!”
  • wait: „Stau cuminte până termină toți ceilalți de mâncat.”
  • & (ampersand): „Bagă-mă în fundal, mă descurc singur.”
  • ps aux: „Spune-mi cine lucrează acum pe server.”

Exemple pozitive & negative — Metafora Comică

Super Admin (face totul ca la carte) Adminul Grăbit (face totul pe fugă)
Folosește:
nohup script.sh > log.txt 2>&1 &
Verifică procesele:
ps aux
Folosește wait pentru sincronizare
Face cleanup la output-uri
Rulează:
./script.sh (în terminal, fără nohup, fără &)
Închide laptopul — scriptul moare
Nu știe unde s-a dus outputul
Se miră de ce procesul s-a oprit

Greșeli frecvente, mituri și alte soluții

  • Mit: „nohup face backup automat la procese.” — Fals! Nu face backup; doar le lasă să ruleze dacă te deconectezi.
  • Mit: „wait funcționează și cu procesele pornite de altcineva.” — Fals! Doar cu procesele pornite în același shell/script.
  • Greșeală: Rulezi cu nohup dar uiți & — procesul nu intră în fundal, terminalul tău rămâne blocat.
  • Greșeală: Nu redirecționezi outputul — te trezești cu un nohup.out uriaș în home.
  • Alternativă: Folosește screen sau tmux dacă vrei sesiuni interactive persistente (dar sunt mai greoaie dacă doar vrei să lași scripturi să ruleze pe silent).

Flowchart → Decizie rapidă: E pentru tine?

Ce vrei să faci?

Vrei să rulezi un script și să-l lași să meargă după ce închizi terminalul?
        ↓
      DA
        ↓
Folosește nohup + & (poate și sleep/wait)
        ↓
Nu vrei să pierzi outputul? 
        ↓
Redirecționează outputul cu > log.txt 2>&1
        ↓
Vrei să revii la sesiunea scriptului și să interacționezi cu el?
        ↓
      DA
        ↓
Folosește screen sau tmux
        ↓
      NU
        ↓
Rămâi la nohup și &

Alte variante similare? Da, vezi și disown pentru Bash, sau bg/fg pentru job control clasic.

Statistici, fapte și utilizări neconvenționale

  • Peste 80% din sysadmini folosesc nohup pentru taskuri de lungă durată (conform unui poll rapid pe Stack Overflow)
  • sleep e utilizat des în scripturi de monitorizare pentru a nu suprasolicita resursele serverului
  • Unii admini folosesc sleep 999999 pentru a ține procesele „în standby” până la kill manual (hack old school!)
  • Când ai nevoie de delay-uri randomizate pentru a evita rate-limiting, combină sleep cu shuf sau $RANDOM

Fun fact: Unii devops folosesc nohup pentru a porni servere web temporare pentru debugging, fără a lăsa sesiunea deschisă.

Exemple de scripturi

Script simplu cu sleep și wait

#!/bin/bash
echo "Pornesc taskurile în paralel..."
nohup ./task1.sh > task1.log 2>&1 &
nohup ./task2.sh > task2.log 2>&1 &
nohup ./task3.sh > task3.log 2>&1 &
wait
echo "Toate taskurile s-au terminat!"

Script cu delay random între taskuri

#!/bin/bash
for i in {1..5}; do
  nohup ./job$i.sh > job$i.log 2>&1 &
  sleep $((RANDOM % 10 + 1))
done
wait
echo "Joburile au terminat!"

Backup automat cu nohup

nohup /usr/local/bin/backup.sh > /var/log/backup.log 2>&1 &

Poveste adevărată din viața unui admin

Andrei, sysadmin la o firmă de e-commerce, avea de migrat 100GB de date pe un server nou. A pornit rsync direct în terminal, fără nohup sau screen. După 3 ore, routerul de acasă a decis să rebooteze. Scriptul: mort. Andrei: dezamăgit. A doua zi, a folosit nohup rsync ... &. A plecat la bere, a venit a doua zi, datele transferate, logul salvat, totul perfect. Sfatul lui: „Nu subestima niciodată puterea unui & bine plasat!”.

Concluzie & recomandări

Dacă vrei să-ți crești productivitatea, să nu-ți mai fie frică de sesiuni SSH pierdute și să automatizezi taskuri fără stres, nohup, wait și sleep sunt prietenii tăi cei mai buni. Sunt simple, universale, rapide și nu-ți cer să înveți tool-uri noi complicate.

  • Folosește nohup și & pentru procese independente
  • Pune wait când ai nevoie de sincronizare între taskuri paralele
  • Adaugă sleep când vrei delay sau throttling
  • Redirecționează outputul pentru debugging ușor
  • Dacă ai nevoie de sesiuni interactive persistente, vezi și screen sau tmux

Vrei să-ți faci viața mai ușoară? Încearcă să rulezi taskurile lungi cu aceste comenzi și vei vedea diferența. Ai nevoie de un VPS rapid sau de un server dedicat ca să pui în practică tot ce ai învățat aici? Ordonează-le și pune-ți scripturile la treabă!

Spor la automatizat! Dacă ai și tu povești amuzante cu procese pierdute sau scripturi reușite, lasă-le în comentarii!

Leave a reply

Your email address will not be published. Required fields are marked