Adesea un program compilat, un binar terț sau un script Python eșuează fără niciun mesaj clar în loguri (sau îngheață la nesfârșit consumând resurse). În loc să ghicești ce face procesul în culise, comanda strace interceptează și afișează toate apelurile de sistem (system calls) pe care programul le transmite nucleului Linux (deschidere fișiere, alocare memorie, scrieri în socket-uri de rețea).
1. Aflarea cauzei pentru care o comandă eșuează la pornire
# Rulăm un binar sub strace și filtrăm doar apelurile legate de fișiere:
strace -e trace=openat,access php script.php
# Output-ul dezvăluie exact fișierele căutate:
# openat(AT_FDCWD, "/etc/php/8.4/cli/php.ini", O_RDONLY) = 3
# openat(AT_FDCWD, "/var/www/.env", O_RDONLY) = -1 ENOENT (No such file or directory)
# -> Am descoperit instantaneu că programul căuta fișierul '.env' care lipsea de pe disc!
2. Atașarea la un Proces de Producție Blocat (-p PID)
Dacă un proces existent (de exemplu un worker cu PID 4512) nu mai răspunde la cereri, vă puteți atașa direct la el fără a-l reporni:
Diagnosticarea unui proces agățat în fundal
# -p 4512 : ID-ul procesului urmărit
# -T : Afișează timpul exact (în secunde) petrecut în interiorul fiecărui apel de sistem
# -tt : Adaugă timestamp cu microsecunde la fiecare linie
# -s 200 : Mărește lungimea șirurilor afișate la 200 caractere (pentru a vedea căile complete)
sudo strace -p 4512 -T -tt -s 200
# Dacă vedeți:
# 18:20:15.123456 read(5, ... ) = ? ERESTARTSYS (sau rămâne blocat aici)
# Procesul este blocat pe descriptorul de fișier numărul 5!
# Verificați cu 'lsof -p 4512' ce reprezintă descriptorul 5 (de regulă un socket de rețea fără timeout configurat).
Opțiuni Utile în strace
-f: Urmărește automat și toate procesele sau thread-urile copil lansate prinfork()/clone().-c: Mod sumar statistic: colectează apelurile și afișează la final un tabel agregat cu numărul total de apeluri, procentul de timp și erorile survenite per syscall.