Último comando e tempo de execução

0

Gostaria de obter o último comando usado e seu tempo de execução. Isso será usado como parte de um alias para notificação.

    
por atlaspaine 11.11.2014 / 04:58

2 respostas

1

NOTA: estou assumindo bash como o shell.

Adaptar-se a outras camadas não deve ser difícil.

Obter o último comando usado é trivial: ele é armazenado no designador de evento do shell !! , e também pode ser obtido usando os recursos incorporados do shell fc ( fc -s ) ou history (com alguns ajustes de string: history 1 | awk '{$1=""}1' ).

Obter o tempo de execução ou o tempo de execução, no entanto, não é, a menos que alguma ação seja executada antes do comando ter sido executado. Uma vez que o comando é executado, nada pode ser feito - os cavalos foram aparafusados.

Para obter o tempo de execução:

  1. Defina a variável HISTTIMEFORMAT , o que faria com que bash economizasse o tempo de execução no histórico e, em seguida, usasse o processamento de texto para extrair o tempo da saída de history .
  2. Use um wrapper para salvar o tempo de execução manualmente.

Para obter o tempo de execução, novamente:

  1. Se você tivesse definido HISTTIMEFORMAT antes de executar o comando, poderia analisar a saída de history para obter o tempo de execução e, em seguida, calcular o tempo de execução.
  2. Use um wrapper para executar o comando com time : time some-command . O processamento da saída de time é um pouco confuso se você quiser deixar a saída do comando intocado .
  3. Use um wrapper para calcular o tempo de execução com base no tempo de execução salvo manualmente.

Com HISTTIMEFORMAT definido

Se você definir a variável HISTTIMEFORMAT , não será necessário usar um wrapper. Primeiro, no seu .bashrc , defina HISTTIMEFORMAT . Você pode configurá-lo para qualquer coisa, desde que não esteja vazio. Se você não quiser que seu comando history mostre a hora, você pode configurá-lo para um espaço ( HISTTIMEFORMAT=" " ).

Agora, há um alias presente no padrão .bashrc do Ubuntu:

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Podemos adaptá-lo para nossos propósitos:

alert_post () 
{ 
    RET=$?;
    END=$(date '+%s');
    LAST_COMM="$(HISTTIMEFORMAT='%s '; history 1)";
    START=$(awk '{print $2}' <<<"$LAST_COMM");
    START_TIME=$(date -d"@$START" '+%T %D');
    COMM=$(awk '{print $3}' <<<"$LAST_COMM");
    notify-send --urgency=low -i "$([ $RET = 0 ] && echo terminal || echo error)" "$COMM started at $START_TIME finished in $((END - START)) seconds.";
    return $RET
}
alias a=alert_post

Você pode usá-lo assim:

$ sleep 10; a

Função Wrapper

Usando uma função ou um script para envolver o comando:

alert_wrapper () 
{ 
    START=$SECONDS;
    START_TIME=$(date '+%T %D');
    COMM="$1";
    "$@";
    RET=$?;
    END=$SECONDS;
    notify-send --urgency=low -i "$([ $RET = 0 ] && echo terminal || echo error)" "$COMM started at $START_TIME finished in $((END - START)) seconds."
    return $RET
}
alias a=alertwrapper

Em seguida, execute seu comando prefixado com a :

$ a sleep 10

Notas:

  1. Existem muitas maneiras de obter o tempo, tanto a execução quanto o tempo de execução. Usei a variável $SECONDS special e o comando date . Você poderia obter apenas o comando date .
  2. Eu usei notify-usd , que deve estar disponível no Ubuntu padrão. Você poderia ver outras maneiras de produzir notificações.
  3. Salvei o status de saída do comando em $RET e devolveu-o , pelo que deverá poder confiar nos códigos de saída: do-something; a || echo "Couldn't do something." ou a do-something || echo "Couldn't do something." irá echo se do-something tiver um estado de saída diferente de zero.
por muru 14.11.2014 / 09:28
0

O último comando é salvo no histórico. Bash tem um comando fc que lhe dá acesso a essa informação (de man bash ):

fc [-e ename] [-lnr] [first] [last]
fc -s [pat=rep] [cmd]
% bl0ck_qu0te%

Existe também um comando chamado history . O manual explica isso em detalhes. Eu não estou muito certo de qual deles se ajustaria melhor às suas necessidades.

Além disso, para ter tempo, você pode querer verificar a configuração do HISTTIMEFORMAT. No entanto, não tenho muita certeza de como você pode acessar o tempo gasto pelo processo. Talvez o TIMEFORMAT deva ser usado no lugar. Caso contrário, a maneira Unix é executar o comando com o comando time . Isso gerará a saída de vários tempos e recursos usados pelo processo durante a execução.

Do manual ( man time ):

% bl0ck_qu0te%     
por Alexis Wilke 11.11.2014 / 06:03