Pertanyaan Tidak ada file atau direktori seperti saat menjalankan / usr / bin / time


Saya sedang membangun rom android saya sendiri. Untuk membangunnya, saya harus berlari

mka -j8 bacon

Namun, saya ingin mengukur waktu yang dibutuhkan untuk membangunnya, jadi saya menggunakannya

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

Ini tidak akan berjalan, karena katanya

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

Setiap bantuan bagaimana mengatasi ini, itu dihargai! Saya menjalankan xubuntu.

Edit:

Untuk beberapa alasan, menggunakan make daripada mka memang berhasil, namun menggunakan mka lebih baik.

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

Edit 2: dari situs web cyanogenmod 

Meminjam $ source build/envsetup.sh atau $ . build/envsetup.sh dari   shell Anda menjalankan skrip envsetup.sh di direktori build.   envsetup.sh menambahkan banyak fungsi ke lingkungan build, paling banyak   yang penting tercantum di bawah ini.

source build/evnsetup.sh adalah perintah yang saya jalankan sebelum mengeksekusi waktu. Salah satu fungsi yang ditambahkan oleh evnsetup.sh adalah mka, apakah mungkin untuk memanggil ini dari dalam time perintah?

Sunting 3: Output dari ketik 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
}

11
2018-03-06 07:18


asal


Sudahkah Anda mencoba untuk menempatkan seluruh jalur mka (sesuatu seperti / usr / bin / mka)? - desgua
Masalahnya adalah bahwa evnupup.sh menginisialisasi beberapa hal. Di terminal saya harus mengeksekusi file itu sebelum saya dapat memanggil mka. Rupanya itu tidak diakui ketika memanggilnya sebagai parameter dari perintah waktu. - P1nGu1n
Bagaimana saya dapat mereproduksi ini? - Braiam
Setelah Anda mengeksekusi Anda source build/evnsetup.sh, pada titik di mana Anda ingin menelepon time mka -j8 bacon, dapatkah Anda memposting output dari perintah type mka? - Malte Skoruppa
@Malte Skoruppa output ditambahkan, mka tampaknya menjadi fungsi bash? - P1nGu1n


Jawaban:


Masalahnya adalah mka adalah fungsi bash yang diekspor oleh skrip Anda dan bukan eksekusi (sebagai lawan dari make), jadi /usr/bin/time tidak menemukannya, karena mencari yang dapat dieksekusi.

Ada dua solusi yang memungkinkan.

Pertama, perhatikan bahwa ada perbedaan antara fungsi bash built-in time, dan yang dapat dieksekusi /usr/bin/time. Ini adalah perintah yang berbeda, yang mengambil parameter berbeda dan menghasilkan output yang berbeda:

$ 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

Mengetik help time untuk mendapatkan bantuan untuk bash yang ada di dalamnya time. Mengetik man time untuk mendapatkan bantuan untuk dieksekusi /usr/bin/time.

Solusi pertama menggunakan time, sedangkan solusi kedua menggunakan /usr/bin/time.

Solusi pertama: menggunakan fungsi bash built-in time

Fungsi bash built-in time sadar akan fungsi bash yang dinyatakan, dan Anda dapat segera menggunakannya untuk mengukur waktu fungsi-fungsi tersebut.

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

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

Dalam kasus Anda, perintah berikut seharusnya berfungsi:

$ time mka -j8 bacon

Ini akan menjadi cara yang saya sukai. Namun, itu mungkin tidak menghasilkan output yang Anda inginkan. Secara khusus, itu tidak mengukur atau mencetak penggunaan CPU.

Solusi kedua: menggunakan executable /usr/bin/time

Anda tidak dapat secara langsung mengukur waktu dari fungsi bash built-in menggunakan /usr/bin/time (sejauh yang saya tahu), tetapi apa yang dapat Anda lakukan adalah mengukur waktu /bin/bash dieksekusi mengeksekusi fungsi bash itu. Ini adalah sedikit peretasan, dan itu menghasilkan sedikit overhead saat Anda meluncurkan contoh tambahan bash. Tetapi biaya overhead ini dapat diabaikan ketika dihadapkan dengan fungsi yang membutuhkan waktu beberapa menit untuk dihitung, jadi mungkin masih sesuai dengan kebutuhan Anda dengan lebih baik.

Untuk dapat meluncurkan /bin/bash dieksekusi pada fungsi bash, kita harus mengekspor fungsi terlebih dahulu.

$ 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

Oleh karena itu, dalam kasus Anda, untuk dapat digunakan /usr/bin/time dan menghasilkan format output yang Anda inginkan, Anda dapat melanjutkan sebagai berikut:

$ 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

11
2018-03-08 06:06



Terima kasih, saya benar-benar mengerti mengapa itu tidak berhasil! Dua pertanyaan singkat, apa yang dilakukan -f parameter, saya tidak dapat menemukan ini. Kedua, apa yang / bin / bash? Sangat menghargai itu! - P1nGu1n
Itu -f parameter ke export memberi tahu export untuk mengekspor fungsi shell. Lihat help export. Itu -f parameter ke /usr/bin/time memberi tahu /usr/bin/time mengharapkan string format, tapi saya menganggap ini Anda tahu. Itu /bin/bash bagian dari perintah terakhir adalah bash executable yang waktu eksekusi sebenarnya diukur, ketika itu sendiri mengeksekusi diekspor mka fungsi. Ini mengeksekusi mka berfungsi karena membaca dan mengeksekusi mka -j8 bacon perintah dari input standar, itulah mengapa kami menggunakan echo dan sebuah pipa. Maaf untuk jawaban terlambat, baca saja ini. :) - Malte Skoruppa