Nenhum arquivo ou diretório ao executar / usr / bin / time

11

Estou construindo meu próprio android rom. Para construí-lo, preciso executar

mka -j8 bacon

No entanto, eu queria medir o tempo necessário para criá-lo, então usei

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon

Isso não será executado, porque está dizendo

/usr/bin/time: cannot run mka: No such file or directory

Qualquer ajuda sobre como contornar isso, é apreciado! Estou executando o xubuntu.

Editar:

Por alguma razão, usar o make em vez do mka funciona, no entanto, usar o mka melhor.

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon

Editar 2: do site cyanogenmod

  

Invocando $ source build/envsetup.sh ou $ . build/envsetup.sh de   seu shell executa o script envsetup.sh no diretório de construção.   Envsetup.sh adiciona muitas funções ao ambiente de criação, o mais   importante dos quais estão listados abaixo.

source build/evnsetup.sh é o comando que eu corro antes de executar o tempo. Uma dessas funções adicionadas por evnsetup.sh é mka , é possível chamar isso de dentro do comando time ?

Editar 3: Saída do tipo mka

$ type mka
mka is a function
mka () 
{ 
    case 'uname -s' in 
        Darwin)
            make -j 'sysctl hw.ncpu|cut -d" " -f2' "$@"
        ;;
        *)
            schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
        ;;
    esac
}
    
por P1nGu1n 06.03.2014 / 08:18

1 resposta

11

O problema é que mka é uma função bash exportada pelo seu script e não um executável (em oposição a make ), portanto, /usr/bin/time não o encontra, pois procura um executável.

Existem duas soluções possíveis.

Primeiro, observe que há uma diferença entre a função interna bash time e o executável /usr/bin/time . Estes são comandos diferentes, que tomam parâmetros diferentes e geram saídas diferentes:

$ time sleep 1

real    0m1.001s
user    0m0.000s
sys     0m0.001s

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 664maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps

Digite help time para obter ajuda para o bash time embutido. Digite man time para obter ajuda para o executável /usr/bin/time .

A primeira solução usa time , enquanto a segunda solução usa /usr/bin/time .

Primeira solução: usando a função interna bash time

A função interna bash time está ciente das funções declaradas do bash, e você pode usá-las imediatamente para medir o tempo de tais funções.

$ foo() {
    sleep 1;
    echo "Hello World"
  }
$ time foo
Hello World

real    0m1.002s
user    0m0.000s
sys     0m0.001s

No seu caso, o seguinte comando deve funcionar:

$ time mka -j8 bacon

Este seria o meu caminho preferido. No entanto, pode não gerar exatamente a saída desejada. Em particular, não mede nem imprime o uso da CPU.

Segunda solução: usando o executável /usr/bin/time

Você não pode medir diretamente o tempo de uma função bash interna usando /usr/bin/time (até onde eu saiba), mas o que você pode fazer é medir o tempo do executável /bin/bash executando essa função bash. Isso é um pouco hacky, e gera um pouco de sobrecarga quando você está lançando uma instância extra de bash . Mas essa sobrecarga pode ser insignificante quando se depara com uma função que leva minutos para ser computada, portanto ela ainda pode atender melhor às suas necessidades.

Para poder executar o executável /bin/bash em uma função bash, temos que exportar a função primeiro.

$ foo() {
    sleep 1;
    echo "Hello World"
  }
$ export -f foo
$ echo foo | /usr/bin/time /bin/bash
Hello World
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1476maxresident)k
0inputs+0outputs (0major+707minor)pagefaults 0swaps

Assim, no seu caso, para poder usar /usr/bin/time e gerar o formato de saída desejado, você pode proceder da seguinte maneira:

$ export -f mka
$ echo 'mka -j8 bacon' | /usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" /bin/bash
    
por Malte Skoruppa 08.03.2014 / 07:06