Por vezes, quando se trabalha com o terminal Linux, é necessário saber a hora de execução de certos comandos, por exemplo, para localizar problemas. Existe um utilitário chamado time
para este fim. Vamos dizer-lhe como funciona o comando time do Linux
e qual é a sua sintaxe. Em seguida, passaremos à descrição das opções disponíveis. E, no final, mencionaremos alguns cenários populares de utilização.
O utilitário executa um comando definido pelo utilizador e, em seguida, apresenta informações sobre o seu tempo de execução. A sua sintaxe é bastante conveniente. Primeiro, é necessário especificar as opções para o tempo
, depois o comando a executar e, por fim, os argumentos para o mesmo:
$ time [options] command_to_execute [arguments]
Vamos considerar a lista de opções disponíveis:
-o
, --output
- guarda os dados no ficheiro selecionado em vez da saída padrão no terminal. Neste caso, os dados antigos no ficheiro serão substituídos.-a
, --append
- adiciona nova informação ao ficheiro em vez de substituir a antiga. A opção só é útil em combinação com -o
.-f
, --format
- seleciona um formato de saída específico. Detalhes sobre a formatação são descritos na próxima secção deste artigo.-p
, --profitably
- usa um formato de saída de dados para estar em conformidade com o padrão POSIX 1003.2.-v
, --verbose
- produz informação detalhada sobre a execução do programa.-V
, --version
- mostra a versão do utilitário de tempo
.Esta lista contém apenas as opções básicas. Pode obter informações detalhadas com o comando:
$ man time
Por defeito , o time
pode produzir informação num formato que não é confortável para a leitura,
É desejável definir opções de formatação de saída, que serão discutidas agora. Há três delas no total. Vamos tomar o comando apt-get update
como exemplo.
A opção -v
é utilizada para produzir informação detalhada:
$ sudo time -v apt-get update
A opção -p
é necessária para produzir dados num formato compatível com POSIX 1003.2:
$ sudo time -p apt-get update
A linha de dados de formatação normalmente inclui especificadores de recursos e texto simples. O sinal %
indica que o caractere seguinte deve ser tratado como um especificador de recurso.
O sinal é utilizado para especificar o carácter delimitador. Existem três opções disponíveis:
t
- tabulação, n
- nova linha, \
- barra invertida. Se especificar qualquer outro carácter depois de , o terminal mostrará um ponto de interrogação (
?
), o que indica um erro de introdução.
O resto do texto na cadeia de formato é completamente copiado para o campo de saída. Neste caso, o time
começa sempre a produzir dados a partir de uma nova linha após a informação sobre a execução do próprio comando.
Vamos considerar os especificadores de recursos disponíveis:
%
- literal %. Ou seja, para emitir um sinal de percentagem, deve especificar %% no comando.C
- nome do comando e argumentos utilizados.D
- tamanho médio da área de dados não dividida. É apresentado em kilobytes.E
- tempo real de execução do comando no formato de hora habitual. É apresentado como [Hours:]<imutes:segundos
.N
- número de erros maiores ou de E/S que ocorreram durante a execução do processo.I
- número de acessos ao sistema de ficheiros.K
- valor médio da memória usada para código(texto
), dados inicializados(dados
) epilha (pilha
). É apresentado em kilobytes.M
- tamanho máximo do conjunto residente durante a execução do processo em kilobytes.O
- número de saídas do sistema de ficheiros.P
- percentagem de carga da CPU (unidade central de processamento).R
- número de erros menores.S
- tempo em segundos durante o qual a CPU foi usada pelo sistema em nome do processo no modo supervisor(
modokernel
).U
- tempo em segundos durante o qual a CPU foi utilizada pelo processo diretamente no modode utilizador
.W
- quantas vezes o processo foi descarregado da RAM.Z
- tamanho da página do sistema. Este valor é uma constante, mas varia entre sistemas.c
- número de trocas involuntárias de contexto durante a execução do processo.e
- tempo real de execução do comando no formato de hora habitual. É apresentado em segundos.k
- número de sinais que chegaram ao processo.p
- tamanho médio da pilha não partilhada do processo, em kilobytes.r
- número de mensagens de socket recebidas.s
- número de mensagens de socket enviadas.t
- tamanho médio do conjunto de residentes do processo, em kilobytes.w
- número de trocas voluntárias de contexto durante a execução do processox
- código de retorno do comando.Estes foram todos os especificadores de recursos usados ao escolher a formatação para o tempo
. Passemos agora aos cenários de utilização do comando.
Vejamos três exemplos básicos que são bastante utilizados: saída para o terminal, saída para um ficheiro separado e saída com formatação.
Como exemplo, vamos utilizar o comando sleep, que faz uma pausa durante um determinado período de tempo. Será um exemplo muito claro, porque o tempo de pausa coincidirá com o tempo de execução do comando no tempo
:
$ time sleep 3
O tempo é escrito imediatamente em três colunas. Vamos analisar cada uma delas:
real
- o tempo total desde o início da execução do processo até a sua conclusão.
user
- o tempo durante o qual o processo foi executado em modode utilizador
.
sys
- tempo durante o qual o processo esteve envolvido no modo supervisor(
modokernel
).
O próximo cenário útil é produzir o tempo que leva para carregar o cabeçalho de uma página da Web por meio do utilitário curl
. Tomemos o nosso sítio Web como exemplo:
$ time curl -I https://losst.ru
Devemos mencionar uma situação em que a execução do comando coloca a janela do terminal num modo diferente, como quando executa o editor nano para modificar o ficheiro /home/root-user/script.txt
:
$ time nano /home/root-user/scripts/main_script.txt
Depois de o editor terminar, verá o tempo total que trabalhou no ficheiro.
Agora já sabe como ver o tempo de execução de um comando Linux.
As informações sobre os resultados do comando time podem ser salvas em um arquivo separado usando a opção-o
. Nesse caso, elas não serão exibidas na janela do terminal. Tomemos o exemplo de extrair o conteúdo do arquivo ~/data/data.tar.gz
usando o utilitário tar
. Vamos guardar a informação sobre o tempo de execução num novo ficheiro ~/data/data_data_time.txt.
Também adicionaremos a opção-v
ao comando para obter informações detalhadas:
$ sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
O ficheiro terá o seguinte conteúdo.
Se utilizar a opção -o
, lembre-se que esta substitui a informação antiga no ficheiro de saída pela nova informação. Isto é aplicável quando se criam novos ficheiros, mas não é adequado para o registo. Com a opção opcional -a, a substituição do conteúdo é substituída pela adição de novas informações:
$ sudo time -v -a -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
A opção original de formatação de dados não é adequada em todos os casos. Como exemplo, vamos utilizar o comando anteriormente utilizado para extrair um arquivo, mas não vamos guardar os dados num ficheiro. Ao executá-lo, estamos interessados em:
especificador%C
. especificador%P
. especificador%e
.Para uma perceção confortável, cada item será apresentado numa linha separada utilizando o separador n
. Ao mesmo tempo, todos eles serão assinados de forma compreensível.
Eis o aspeto da versão final do comando:
sudo time -f "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data
Todo o texto, exceto os caracteres a seguir a %
, é totalmente apresentado no terminal. Esta é uma forma conveniente de marcar