No existe tal archivo o directorio al ejecutar / usr / bin / time


11

Estoy construyendo mi propia rom de Android. Para construirlo, necesito ejecutar

mka -j8 bacon

Sin embargo, quería medir el tiempo que tardó en construirlo, así que usé

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

Esto no funcionará, porque dice

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

Se agradece cualquier ayuda para solucionar esto. Estoy ejecutando xubuntu.

Editar:

Por alguna razón, usar make en lugar de mka funciona, sin embargo, usar mka es mejor.

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

Edición 2: del sitio web cyanogenmod

Invocando $ source build/envsetup.sho $ . build/envsetup.shdesde su shell ejecuta el script envsetup.sh en el directorio de compilación. envsetup.sh agrega muchas funciones al entorno de compilación, las más importantes se enumeran a continuación.

source build/evnsetup.shes el comando que ejecuto antes de ejecutar el tiempo. Una de esas funciones agregadas por evnsetup.sh es mka, ¿es posible llamar a esto desde el timecomando?

Edición 3: Salida de 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
}

¿Has intentado poner todo el camino de mka (algo así como / usr / bin / mka)?
desgua

El problema es que evnsetup.sh inicializa algunas cosas. En la terminal tengo que ejecutar ese archivo antes de poder llamar a mka. Aparentemente no se reconoce al llamarlo como un parámetro desde el comando de tiempo.
P1nGu1n

¿Cómo puedo reproducir esto?
Braiam

Después de ejecutar su source build/evnsetup.sh, en el punto donde desea llamar time mka -j8 bacon, ¿puede publicar la salida del comando type mka?
Malte Skoruppa

@MalteSkoruppa salida agregada, mka parece ser una función bash?
P1nGu1n

Respuestas:


11

El problema es que mkaes una función bash exportada por su script y no un ejecutable (a diferencia de make), por lo /usr/bin/timeque no la encuentra, ya que busca un ejecutable.

Hay dos posibles soluciones.

Primero, tenga en cuenta que hay una diferencia entre la función incorporada bash timey el ejecutable /usr/bin/time. Estos son comandos diferentes, que toman diferentes parámetros y generan diferentes resultados:

$ 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

Escriba help timepara obtener ayuda para el bash incorporado time. Escriba man timepara obtener ayuda para el ejecutable /usr/bin/time.

La primera solución usa time, mientras que la segunda solución usa /usr/bin/time.

Primera solución: usar la función incorporada bash time

La función incorporada bash timees consciente de las funciones bash declaradas, y puede usarla inmediatamente para medir el tiempo de dichas funciones.

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

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

En su caso, el siguiente comando debería funcionar:

$ time mka -j8 bacon

Esta sería mi forma preferida. Sin embargo, es posible que no genere exactamente la salida que desea. En particular, no mide ni imprime el uso de la CPU.

Segunda solución: usar el ejecutable /usr/bin/time

No puede medir directamente el tiempo de una función bash incorporada utilizando /usr/bin/time(hasta donde yo sé), pero lo que puede hacer es medir el tiempo del /bin/bashejecutable que ejecuta esa función bash. Esto es un poco hacky, y genera un poco de sobrecarga al iniciar una instancia adicional de bash. Pero esta sobrecarga puede ser insignificante cuando se enfrenta a una función que requiere minutos para calcular, por lo que aún puede satisfacer mejor sus necesidades.

Para poder /bin/bashejecutar el ejecutable en una función bash, primero tenemos que exportar la función.

$ 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

Por lo tanto, en su caso, para poder usar /usr/bin/timey generar el formato de salida que desee, puede proceder de la siguiente manera:

$ 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

Gracias, realmente entiendo por qué no estaba funcionando. Dos preguntas cortas, qué hace el -fparámetro, no pude encontrar esto. En segundo lugar, ¿qué significa / bin / bash? ¡Realmente lo aprecio!
P1nGu1n

1
El -fparámetro a exportle dice exporta exportar una función de shell. Ver help export. El -fparámetro to /usr/bin/timedice /usr/bin/timeque espere una cadena de formato, pero supongo que ya lo sabe. La /bin/bashparte del último comando es el ejecutable bash, cuyo tiempo de ejecución se mide realmente, cuando ejecuta la mkafunción exportada . Ejecuta la mkafunción porque lee y ejecuta el mka -j8 baconcomando a partir de la entrada estándar, por lo que usamos echoy una tubería. Perdón por la respuesta tardía, solo lea esto. :)
Malte Skoruppa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.