Brak takiego pliku lub katalogu podczas wykonywania / usr / bin / time

11

Buduję swój własny ROM dla Androida. Aby go zbudować, muszę biec

mka -j8 bacon

Chciałem jednak zmierzyć czas potrzebny na jego zbudowanie, więc wykorzystałem

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

To nie zadziała, bo to mówi

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

Doceniamy wszelką pomoc w obejściu tego problemu! Używam Xubuntu.

Edytować:

Z jakiegoś powodu użycie make zamiast mka działa, jednak lepsze jest użycie mka .

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

Edycja 2: ze strony cyanogenmod

Wywołanie $ source build/envsetup.shlub $ . build/envsetup.shz poziomu powłoki uruchamia skrypt envsetup.sh w katalogu kompilacji. envsetup.sh dodaje wiele funkcji do środowiska kompilacji, z których najważniejsze są wymienione poniżej.

source build/evnsetup.shto polecenie, które uruchamiam przed wykonaniem czasu. Jedną z tych funkcji dodanych przez evnsetup.sh jest to mka, czy można to wywołać z poziomu timepolecenia?

Edycja 3: Wyjście typu 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
źródło
Czy próbowałeś umieścić całą ścieżkę mka (coś takiego jak / usr / bin / mka)?
desgua
Problem polega na tym, że evnsetup.sh inicjuje niektóre rzeczy. W terminalu muszę wykonać ten plik, zanim będę mógł wywołać mka. Najwyraźniej nie jest rozpoznawany, gdy wywołuje się go jako parametr z komendy time.
P1nGu1n
Jak mogę to odtworzyć?
Braiam
Po wykonaniu polecenia source build/evnsetup.shw miejscu, w którym chcesz zadzwonić time mka -j8 bacon, możesz opublikować wynik polecenia type mka?
Malte Skoruppa
@ Wyjście MalteSkoruppa dodane, mka wydaje się być funkcją bash?
P1nGu1n

Odpowiedzi:

11

Problem polega na tym, że mkajest to funkcja bash eksportowana przez twój skrypt, a nie plik wykonywalny (w przeciwieństwie do make), więc /usr/bin/timenie może go znaleźć, ponieważ szuka pliku wykonywalnego.

Istnieją dwa możliwe rozwiązania.

Po pierwsze, zauważ, że istnieje różnica między wbudowaną funkcją bash timea plikiem wykonywalnym /usr/bin/time. Są to różne polecenia, które przyjmują różne parametry i generują różne dane wyjściowe:

$ 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

Wpisz, help timeaby uzyskać pomoc dotyczącą wbudowanej wersji bash time. Wpisz, man timeaby uzyskać pomoc dotyczącą pliku wykonywalnego /usr/bin/time.

Pierwsze rozwiązanie wykorzystuje time, podczas gdy drugie rozwiązanie używa /usr/bin/time.

Pierwsze rozwiązanie: za pomocą wbudowanej funkcji bash time

Wbudowana funkcja timebash rozpoznaje zadeklarowane funkcje bash i możesz od razu użyć jej do pomiaru czasu takich funkcji.

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

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

W twoim przypadku powinno działać następujące polecenie:

$ time mka -j8 bacon

To byłby mój preferowany sposób. Jednak może nie wygenerować dokładnie oczekiwanego wyniku. W szczególności nie mierzy ani nie drukuje użycia procesora.

Drugie rozwiązanie: użycie pliku wykonywalnego /usr/bin/time

/usr/bin/timeO ile wiem, nie możesz bezpośrednio zmierzyć czasu wbudowanej funkcji bash , ale możesz zmierzyć czas /bin/bashwykonywalnego wykonania tej funkcji bash. Jest to trochę zuchwałe i generuje trochę narzutu, gdy uruchamiasz dodatkową instancję bash. Ale narzut ten może być nieistotny w obliczu funkcji, której obliczenie zajmuje kilka minut, więc może lepiej odpowiadać Twoim potrzebom.

Aby móc uruchomić /bin/bashplik wykonywalny na funkcji bash, musimy najpierw wyeksportować tę funkcję.

$ 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

Dlatego w twoim przypadku, aby móc użyć /usr/bin/timei wygenerować żądany format wyjściowy, możesz wykonać następujące czynności:

$ 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
źródło
Dziękuję, naprawdę rozumiem, dlaczego to nie działało! Dwa krótkie pytania, na czym polega -fparametr, nie mogłem tego znaleźć. Po drugie, co oznacza / bin / bash? Naprawdę to doceniam!
P1nGu1n
1
-fParametr exportmówi exporteksportować funkcję powłoki. Zobaczyć help export. -fParametr /usr/bin/timemówi /usr/bin/timesię spodziewać ciąg formatu, ale zakładam, że to wiesz. /bin/bashCzęść ostatniego polecenia jest wykonywalny bash, których wykonanie jest rzeczywiście mierzy czas, kiedy ona sama wykonuje eksportowanych mkafunkcji. Wykonuje mkafunkcję, ponieważ czyta i wykonuje mka -j8 baconpolecenie ze standardowego wejścia, dlatego używamy echoi potoku. Przepraszam za późną odpowiedź, po prostu przeczytaj to. :)
Malte Skoruppa