Keine solche Datei oder kein solches Verzeichnis bei der Ausführung von / usr / bin / time

11

Ich baue mein eigenes Android-Rom. Um es zu bauen, muss ich laufen

mka -j8 bacon

Ich wollte jedoch die Zeit messen, die zum Erstellen benötigt wurde, also habe ich verwendet

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

Das läuft nicht, weil es heißt

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

Jede Hilfe, um dies zu umgehen, ist willkommen! Ich laufe xubuntu.

Bearbeiten:

Aus irgendeinem Grund funktioniert die Verwendung von make anstelle von mka, jedoch ist die Verwendung von mka besser.

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

Edit 2: von der Cyanogenmod-Website

Beim Aufrufen $ source build/envsetup.shoder $ . build/envsetup.shüber Ihre Shell wird das Skript envsetup.sh im Erstellungsverzeichnis ausgeführt. envsetup.sh fügt der Build-Umgebung viele Funktionen hinzu, von denen die wichtigsten unten aufgeführt sind.

source build/evnsetup.shist der Befehl, den ich vor der Ausführung der Zeit ausführe. Eine dieser zusätzlichen Funktionen von evnsetup.sh ist mka, ist es möglich, dies innerhalb des timeBefehls aufzurufen ?

Edit 3: Ausgabe vom Typ 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
quelle
Haben Sie versucht, den gesamten Pfad von mka (so etwas wie / usr / bin / mka) zu setzen?
Desgua
Das Problem ist, dass evnsetup.sh einige Dinge initialisiert. Im Terminal muss ich diese Datei ausführen, bevor ich mka aufrufen kann. Anscheinend wird es nicht erkannt, wenn es als Parameter aus dem Zeitbefehl aufgerufen wird.
P1nGu1n
Wie kann ich das reproduzieren?
Braiam
Können Sie nach der Ausführung von source build/evnsetup.shan der Stelle, an der Sie aufrufen möchten, time mka -j8 bacondie Ausgabe des Befehls veröffentlichen type mka?
Malte Skoruppa
@ MalteSkoruppa Ausgabe hinzugefügt, scheint mka eine Bash-Funktion zu sein?
P1nGu1n

Antworten:

11

Das Problem ist, dass mkaes sich um eine von Ihrem Skript exportierte Bash-Funktion handelt und nicht um eine ausführbare Datei (im Gegensatz zu make). Sie wird daher /usr/bin/timenicht gefunden, da nach einer ausführbaren Datei gesucht wird.

Es gibt zwei mögliche Lösungen.

Beachten Sie zunächst, dass es einen Unterschied zwischen der integrierten Bash-Funktion timeund der ausführbaren Datei gibt /usr/bin/time. Dies sind verschiedene Befehle, die unterschiedliche Parameter annehmen und unterschiedliche Ausgaben erzeugen:

$ 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

Geben Sie ein help time, um Hilfe für die integrierte Bash zu erhalten time. Geben Sie ein man time, um Hilfe für die ausführbare Datei zu erhalten /usr/bin/time.

Die erste Lösung verwendet time, während die zweite Lösung verwendet /usr/bin/time.

Erste Lösung: Verwenden der integrierten Bash-Funktion time

Die integrierte Bash-Funktion timekennt deklarierte Bash-Funktionen, und Sie können sie sofort verwenden, um die Zeit solcher Funktionen zu messen.

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

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

In Ihrem Fall sollte der folgende Befehl funktionieren:

$ time mka -j8 bacon

Dies wäre mein bevorzugter Weg. Möglicherweise wird jedoch nicht genau die gewünschte Ausgabe generiert. Insbesondere wird die CPU-Auslastung nicht gemessen oder gedruckt.

Zweite Lösung: Verwenden der ausführbaren Datei /usr/bin/time

Sie können die Zeit einer integrierten Bash-Funktion nicht direkt mit /usr/bin/time(soweit ich weiß) messen, aber Sie können die Zeit der /bin/bashausführbaren Datei messen, die diese Bash-Funktion ausführt. Dies ist ein wenig hackig und erzeugt einen kleinen Overhead, wenn Sie eine zusätzliche Instanz von starten bash. Dieser Overhead kann jedoch vernachlässigbar sein, wenn Sie mit einer Funktion konfrontiert werden, deren Berechnung Minuten dauert, sodass er Ihren Anforderungen möglicherweise noch besser entspricht.

Um die /bin/bashausführbare Datei für eine Bash-Funktion starten zu können , müssen wir zuerst die Funktion exportieren.

$ 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

In Ihrem Fall können /usr/bin/timeSie daher wie folgt vorgehen, um das gewünschte Ausgabeformat verwenden und generieren zu können :

$ 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
quelle
Danke, ich verstehe wirklich, warum es nicht funktioniert hat! Zwei kurze Fragen, was macht der -fParameter, ich konnte dies nicht finden. Zweitens, was macht / bin / bash? Schätze es wirklich!
P1nGu1n
1
Der -fParameter zum exportAnweisen export, eine Shell-Funktion zu exportieren. Siehe help export. Der -fParameter to /usr/bin/timesagt /usr/bin/time, dass eine Formatzeichenfolge erwartet werden soll, aber ich gehe davon aus, dass Sie dies wissen. Der /bin/bashTeil des letzten Befehls ist die ausführbare Bash-Datei, deren Ausführungszeit tatsächlich gemessen wird, wenn sie selbst die exportierte mkaFunktion ausführt . Es führt die mkaFunktion aus, weil es den mka -j8 baconBefehl von der Standardeingabe liest und ausführt , weshalb wir echoeine Pipe verwenden. Entschuldigung für die späte Antwort, lesen Sie diese einfach. :)
Malte Skoruppa