Aucun fichier ou répertoire de ce type lors de l'exécution de / usr / bin / time

11

Je construis ma propre rom Android. Pour le construire, je dois exécuter

mka -j8 bacon

Cependant, je voulais mesurer le temps nécessaire pour le construire, alors j'ai utilisé

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

Cela ne fonctionnera pas, car il dit

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

Toute aide pour contourner cela, c'est apprécié! J'exécute xubuntu.

Éditer:

Pour une raison quelconque, utiliser make au lieu de mka fonctionne, mais utiliser mka est préférable.

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

Edit 2: à partir du site Web de cyanogenmod

L'appel $ source build/envsetup.shou $ . build/envsetup.shdepuis votre shell exécute le script envsetup.sh dans le répertoire de construction. envsetup.sh ajoute de nombreuses fonctions à l'environnement de génération, dont les plus importantes sont répertoriées ci-dessous.

source build/evnsetup.shest la commande que j'exécute avant d'exécuter le temps. L'une de ces fonctions ajoutées par evnsetup.sh est mka, est-il possible d'appeler cela depuis la timecommande?

Edit 3: Sortie de type 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
}
P1nGu1n
la source
Avez-vous essayé de mettre tout le chemin de mka (quelque chose comme / usr / bin / mka)?
desgua
Le problème est que evnsetup.sh initialise certaines choses. Dans le terminal, je dois exécuter ce fichier avant de pouvoir appeler mka. Apparemment, il n'est pas reconnu lors de son appel en tant que paramètre à partir de la commande time.
P1nGu1n
Comment puis-je reproduire cela?
Braiam
Après avoir exécuté votre source build/evnsetup.sh, au point où vous souhaitez appeler time mka -j8 bacon, pouvez-vous publier la sortie de la commande type mka?
Malte Skoruppa
Ajout de la sortie @MalteSkoruppa, mka semble être une fonction bash?
P1nGu1n

Réponses:

11

Le problème est qu'il mkas'agit d'une fonction bash exportée par votre script et non d'un exécutable (par opposition à make), donc /usr/bin/timene la trouve pas, car elle recherche un exécutable.

Il y a deux solutions possibles.

Tout d'abord, notez qu'il existe une différence entre la fonction intégrée bash timeet l'exécutable /usr/bin/time. Ce sont des commandes différentes, qui prennent différents paramètres et génèrent des sorties différentes:

$ 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

Tapez help timepour obtenir de l'aide pour le bash intégré time. Tapez man timepour obtenir de l'aide sur l'exécutable /usr/bin/time.

La première solution utilise time, tandis que la deuxième solution utilise /usr/bin/time.

Première solution: utiliser la fonction intégrée bash time

La fonction intégrée bash timeconnaît les fonctions bash déclarées et vous pouvez immédiatement l'utiliser pour mesurer le temps de ces fonctions.

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

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

Dans votre cas, la commande suivante devrait fonctionner:

$ time mka -j8 bacon

Ce serait ma façon préférée. Cependant, il peut ne pas générer exactement la sortie souhaitée. En particulier, il ne mesure ni n'imprime l'utilisation du processeur.

Deuxième solution: utiliser l'exécutable /usr/bin/time

Vous ne pouvez pas mesurer directement le temps d'une fonction bash intégrée à l'aide /usr/bin/time(pour autant que je sache), mais ce que vous pouvez faire est de mesurer le temps de l' /bin/bashexécutable exécutant cette fonction bash. C'est un peu hacky, et cela génère un peu de surcharge lorsque vous lancez une instance supplémentaire de bash. Mais cette surcharge peut être négligeable face à une fonction qui prend quelques minutes à calculer, elle peut donc toujours mieux répondre à vos besoins.

Pour pouvoir lancer l' /bin/bashexécutable sur une fonction bash, nous devons d'abord exporter la fonction.

$ 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

Par conséquent, dans votre cas, pour pouvoir utiliser /usr/bin/timeet générer le format de sortie que vous souhaitez, vous pouvez procéder comme suit:

$ 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
Malte Skoruppa
la source
Merci, je comprends vraiment pourquoi ça ne fonctionnait pas! Deux petites questions, qu'est-ce que le -fparamètre, je n'ai pas pu trouver cela. Deuxièmement, qu'est-ce que / bin / bash? J'apprécie beaucoup!
P1nGu1n
1
Le -fparamètre à exportindique exportd'exporter une fonction shell. Tu vois help export. Le -fparamètre à /usr/bin/timeindique /usr/bin/timed'attendre une chaîne de format, mais je suppose que vous le savez. La /bin/bashpartie de la dernière commande est l'exécutable bash dont le temps d'exécution est réellement mesuré, lorsqu'il exécute lui-même la mkafonction exportée . Il exécute la mkafonction car il lit et exécute la mka -j8 baconcommande à partir de l'entrée standard, c'est pourquoi nous utilisons echoun canal. Désolé pour la réponse tardive, lisez juste ceci. :)
Malte Skoruppa