Utilizarea comenzii timeout in Linux

Configurare noua (How To)

Situatie

Comanda `timeout` execută o altă comandă și o oprește dacă aceasta depășește limita de timp stabilită. Sintaxa este simplă: se specifică mai întâi durata, apoi comanda, de exemplu: `timeout 10 ping example.com`. Durata este exprimată implicit în secunde, dar pot fi folosite și sufixe: `m` pentru minute, `h` pentru ore și `d` pentru zile.

De ce este important acest lucru? După cum probabil știi, unele comenzi se pot bloca. O cerere de rețea poate aștepta un răspuns de la un server indisponibil, un script se poate opri din cauza unei resurse blocate, ori o operațiune de backup poate dura mult mai mult decât era prevăzut.

Într-un terminal interactiv, poți folosi combinația de taste Ctrl+C. Însă, în cazul unui job cron sau al unui script automatizat, nu există nimeni care să intervină, iar un proces blocat se poate acumula sau poate bloca toate celelalte procese aflate în așteptare. Executarea comenzii problematice prin intermediul `timeout` asigură continuarea rulării scriptului.

Solutie

În mod implicit, `timeout` trimite semnalul TERM la expirarea timpului, solicitând procesului să se închidă în mod ordonat. Unele programe ignoră acest semnal, motiv pentru care opțiunea `-k` introduce un al doilea termen-limită, după care `timeout` trimite semnalul KILL, care nu poate fi ignorat. De exemplu, comanda `timeout -k 5 30 ./long-task.sh` acordă scriptului treizeci de secunde, urmate de încă cinci pentru a se închide corect înainte de a fi oprit forțat. Opțiunea `-s` permite alegerea unui semnal complet diferit.

Codul de ieșire este la fel de util ca și limitarea timpului de execuție. Atunci când o comandă este oprită pentru că a depășit limita alocată, `timeout` se închide cu codul 124. Scripturile pot verifica această valoare pentru a distinge între o oprire cauzată de expirarea timpului și o eroare obișnuită, putând ulterior să reîncerce execuția, să înregistreze un avertisment sau să treacă la pasul următor. Utilizarea opțiunii `–preserve-status` determină `timeout` să returneze, în schimb, codul de ieșire al comenzii propriu-zise.

Un aspect de reținut: în mod implicit, `timeout` execută comanda într-un grup de procese de fundal, astfel încât programele interactive care așteaptă introducerea datelor de la tastatură s-ar putea comporta neobișnuit. Opțiunea `–foreground` rezolvă această problemă; totodată, merită să testezi orice program care citește date din terminal înainte de a te baza pe el.

Tip solutie

Permanent

Voteaza

(5 din 14 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?