terça-feira, 29 de janeiro de 2013

O comando está demorando muito?

Quem administra um servidor Linux está acostumado a criar script. E certamente já se deparou com um comando ou rotina que demora demais atrapalhando o fluxo do programa. As vezes pode ser um arquivo muito grande que está demorando para ser tratado (uma conversão de um arquivo de video muito grande), ou uma transferência de arquivos que está demorando mais do que o esperado. Seria muito interessante que o script fosse inteligente o suficiente para detectar essa demora e derrubar o processo em questão. Uma forma de fazer isso é com o comando "timeout".

Vamos supor que você tem um script que cuida da conversão de arquivos de video, e que há uma fila de arquivos para ser processados. O comando seria algo parecido com isso:

$ ffmpeg -i origem.wmv destino.avi

Vamos supor que se um arquivo demorar mais que 10 minutos para ser convertido, o processo deverá ser cancelado, uma mensagem de erro gerada, e o próximo arquivo da fila deverá ser processado. O comando seria algo parecido com isso:

$ timeout 600 ffmpeg -i origem.wmv destino.avi

Caso o comando demore mais do que 600 segundos (10 minutos), o comando é cancelado e é gerado o erro 124 que poderá ser tratado no teu script.

O mesmo serve também para conexões demoradas. Abaixo um exemplo de uma conexão sendo fechada após 5 segundos.

$ timeout 5 telnet 172.20.1.4 25
Trying 172.20.1.4...
Connected to 172.20.1.4.
Escape character is '^]'.
220 fpasrv029.fpanet.inet Microsoft ESMTP MAIL Service ready at Tue, 29 Jan 2013 10:37:17 -0200
$ echo $?
124