/ usr / bin / timeの実行時にそのようなファイルまたはディレクトリはありません


11

独自のAndroid ROMを構築しています。ビルドするには、実行する必要があります

mka -j8 bacon

ただし、構築にかかった時間を測定したいので、

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

言っているので、これは実行されません

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

これを回避する方法はありますか?私はxubuntuを実行しています。

編集:

何らかの理由で、しかし使用して、メイクを使用して代わりに、MKAの作業を行うMKAが優れています。

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

編集2:cyanogenmod Webサイト から

シェルから起動する$ source build/envsetup.sh$ . build/envsetup.sh、シェルからenvsetup.shスクリプトをビルドディレクトリで実行します。envsetup.shは、ビルド環境に多くの機能を追加します。その中で最も重要なものを以下に示します。

source build/evnsetup.shtimeを実行する前に実行するコマンドです。evnsetup.shによって追加された関数の1つはです。mkaこれをtimeコマンド内から呼び出すことはできますか?

編集3:タイプ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
}

mkaのパス全体(/ usr / bin / mkaなど)を配置しようとしましたか?
デスグア14年

問題は、evnsetup.shがいくつかのものを初期化することです。ターミナルでは、mkaを呼び出す前にそのファイルを実行する必要があります。どうやら、timeコマンドからパラメーターとして呼び出すと認識されません。
P1nGu1n 14年

これをどのように再現できますか?
Braiam 14年

あなたが実行した後source build/evnsetup.sh、呼び出したい時点でtime mka -j8 bacon、あなたは、コマンドの出力を投稿することができますかtype mka
マルテスコルッパ14年

@MalteSkoruppa出力が追加されました。mkaはbash関数のように見えますか?
P1nGu1n 14年

回答:


11

問題はmka、スクリプトによってエクスポートされたbash関数であり、(実行可能ファイルではなくmake)実行可能ファイルで/usr/bin/timeはないため、実行可能ファイルを検索するため、検出されないことです。

2つの解決策があります。

まず、bash組み込み関数timeと実行可能ファイルには違いがあることに注意してください/usr/bin/time。これらは異なるコマンドであり、異なるパラメーターを取り、異なる出力を生成します。

$ 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

入力help timeしてbash組み込みのヘルプを表示しtimeます。入力man timeして実行可能ファイルのヘルプを表示します/usr/bin/time

最初のソリューションではを使用しますtimeが、2番目のソリューションではを使用し/usr/bin/timeます。

最初の解決策:bash組み込み関数の使用 time

bash組み込み関数timeは宣言されたbash関数を認識しているため、この関数を使用して、そのような関数の時間を測定できます。

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

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

あなたの場合、次のコマンドが機能するはずです。

$ time mka -j8 bacon

これは私の好みの方法です。ただし、必要な出力が正確に生成されない場合があります。特に、CPU使用率を測定または印刷しません。

2番目の解決策:実行可能ファイルを使用する /usr/bin/time

/usr/bin/time(私の知る限り)を使用して組み込みbash関数の時間を直接測定することはできませんが、実行できるのは/bin/bashそのbash関数を実行する実行可能ファイルの時間を測定することです。これは少しハックで、の追加のインスタンスを起動するときに少しオーバーヘッドが発生しますbash。ただし、計算に数分かかる関数に直面した場合、このオーバーヘッドは無視できるため、ニーズにより適している場合があります。

/bin/bashbash関数で実行可能ファイルを起動できるようにするには、まず関数をエクスポートする必要があります。

$ 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

したがって、あなたのケースでは、必要な/usr/bin/time出力フォーマットを使用して生成できるようにするには、次のようにします。

$ 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

ありがとう、どうしてうまくいかなかったのか本当によくわかります!2つの短い質問、-fパラメーターは何であるか、これを見つけることができませんでした。次に、/ bin / bashとは何ですか?心から感謝する!
P1nGu1n

1
-fパラメータはexport伝えexportシェル関数をエクスポートします。を参照してくださいhelp export-fパラメータは/usr/bin/time伝え/usr/bin/timeフォーマット文字列を期待するが、私は、あなたが知っている、これを前提としています。/bin/bash最後のコマンドの一部は、それ自体がエクスポートされたmka関数を実行するときの実行時間が実際に測定されるbash実行可能ファイルです。それは実行しmka、それが読み込んで実行されるための機能をmka -j8 bacon標準我々が使用する理由である入力からコマンドをechoパイプ。遅い答えてすみません、これを読んでください。:)
マルテスコルッパ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.