como tempo uma certa parte de um executável?

3

Eu estava procurando na internet para descobrir se já havia uma maneira de sincronizar uma determinada parte de um executável / script para ver quanto tempo essa parte demora, mas tudo que eu acho é mais para fora do arquivo. Por isso quero introduzir uma linha que inicie um temporizador e no final da parte pára o temporizador e mostra-me o tempo decorrido, não a coisa toda, mas apenas uma parte.
exemplo:

  #!/bin/sh
    IPTABLES="/sbin/iptables"
    BLOCKEDIPS_XS=/root/iptables/iptables/blockxs.zone
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES --delete-chain
$IPTABLES -F FORWARD
$IPTABLES -F -t mangle
$IPTABLES -F -t nat
$IPTABLES -X
timer start
/bin/egrep -v "^#|^$" $BLOCKEDIPS_XS | while IFS= read -r ip
do
    # Append everything to droplist
    $IPTABLES -A droplist -i eth0 -s $ip -j LOG --log-prefix " Drop IP List blockxs "
    $IPTABLES -A droplist -i eth0 -s $ip -j DROP
done <"$BLOCKEDIPS_XS"
timer stops, shows elapsed time
    
por delfiler 16.05.2018 / 11:58

3 respostas

3

Um time que opera em grupos de comandos e a variável SECONDS são recursos bash, não sh. Com sh, você pode obter os timestamps nos dois pontos usando o comando date e, em seguida, obter a diferença. date +%s dará o tempo em segundos desde a época.

# timer start
start=$(date +%s)
/bin/egrep -v "^#|^$" $BLOCKEDIPS_XS | while IFS= read -r ip
do
    # Append everything to droplist
    $IPTABLES -A droplist -i eth0 -s $ip -j LOG --log-prefix " Drop IP List blockxs "
    $IPTABLES -A droplist -i eth0 -s $ip -j DROP
done <"$BLOCKEDIPS_XS"
# timer stops, shows elapsed time
echo $(( $(date +%s) - start ))
    
por muru 16.05.2018 / 15:49
5

Você pode programar parte de um script bash usando o agrupamento de comandos

#!/bin/bash

echo "foo"
sleep 1

time { 
sleep 2
echo "bar"
sleep 3
}

sleep 1
echo "baz"

Ex.

$ ./somescript.sh 
foo
bar

real    0m5.006s
user    0m0.005s
sys 0m0.001s
baz

O agrupamento com um subshell (ou seja, parênteses no lugar de chaves) também deve funcionar.

    
por steeldriver 16.05.2018 / 13:04
2

A maneira mais fácil é colocar o comando time na frente do comando que você está executando. Por exemplo:

$ time locate display-auto
/etc/cron.d/display-auto-brightness
/home/rick/Downloads/display-auto-brightness
/home/rick/Pictures/display-auto-brightness conky.png
/home/rick/Pictures/display-auto-brightness systray.png
/home/rick/Pictures/display-auto-brightness-config 1.png
/home/rick/Pictures/ps display-auto-brightness.png
/lib/systemd/system-sleep/display-auto-brightness
/mnt/e/etc/cron.d/display-auto-brightness
/mnt/e/lib/systemd/system-sleep/display-auto-brightness
/mnt/e/usr/local/bin/display-auto-brightness
/usr/local/bin/display-auto-brightness

real    0m0.826s
user    0m0.803s
sys     0m0.016s

Estamos usando o comando locate para encontrar todos os nomes de arquivos com display-auto nos nomes. Basta inserir o comando time na frente do comando.

Obtendo tempo para parte do script

Você pode usar a variável $SECONDS dentro do seu script para obter o tempo para uma parte dele. Por exemplo:

SECONDS=0
/bin/egrep -v "^#|^$" $BLOCKEDIPS_XS | while IFS= read -r ip
do
    # Append everything to droplist
    $IPTABLES -A droplist -i eth0 -s $ip -j LOG --log-prefix " Drop IP List blockxs "
    $IPTABLES -A droplist -i eth0 -s $ip -j DROP
done <"$BLOCKEDIPS_XS"
timer stops, shows elapsed time
BlockTime=$SECONDS
echo "Total time to block IPs: $BlockTime Seconds"

Neste código, o SECONDS é redefinido para zero e, em seguida, obtido após um longo processo.

    
por WinEunuuchs2Unix 16.05.2018 / 12:44