Tidak ada file atau direktori seperti itu ketika menjalankan / usr / bin / time

11

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 gunakan

/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, sangat dihargai! Saya menjalankan xubuntu.

Edit:

Untuk beberapa alasan, menggunakan make bukan mka berfungsi, namun menggunakan mka lebih baik.

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

Sunting 2: dari situs web cyanogenmod

Meminta $ source build/envsetup.shatau $ . build/envsetup.shdari shell Anda menjalankan skrip envsetup.sh di direktori build. envsetup.sh menambahkan banyak fungsi ke lingkungan build, yang paling penting terdaftar di bawah ini.

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

Sunting 3: Output dari jenis 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
sumber
Sudahkah Anda mencoba meletakkan seluruh path mka (sesuatu seperti / usr / bin / mka)?
desgua
Masalahnya adalah bahwa evnsetup.sh menginisialisasi beberapa hal. Di terminal saya harus menjalankan file itu sebelum saya dapat memanggil mka. Rupanya itu tidak dikenali ketika memanggilnya sebagai parameter dari perintah waktu.
P1nGu1n
Bagaimana saya bisa mereproduksi ini?
Braiam
Setelah Anda mengeksekusi 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:

11

Masalahnya adalah itu mkaadalah fungsi bash yang diekspor oleh skrip Anda dan bukan yang dapat dieksekusi (berlawanan dengan make), jadi /usr/bin/timetidak menemukannya, karena ia mencari yang dapat dieksekusi.

Ada dua solusi yang mungkin.

Pertama, perhatikan bahwa ada perbedaan antara fungsi built-in bash 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

Ketik help timeuntuk mendapatkan bantuan untuk bash bawaan time. Ketik man timeuntuk mendapatkan bantuan bagi yang dapat dieksekusi /usr/bin/time.

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

Solusi pertama: menggunakan fungsi built-in bash time

Fungsi bawaan bash timemengetahui fungsi bash yang dideklarasikan, dan Anda dapat segera menggunakannya untuk mengukur waktu 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 harus 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 menggunakan fungsi bash bawaan /usr/bin/time(sejauh yang saya tahu), tetapi yang dapat Anda lakukan adalah mengukur waktu /bin/basheksekusi yang dapat dijalankan dengan menjalankan fungsi bash tersebut. Ini sedikit hacky, dan menghasilkan sedikit overhead saat Anda meluncurkan contoh tambahan bash. Tetapi overhead ini dapat diabaikan ketika dihadapkan dengan fungsi yang membutuhkan hitungan menit untuk dihitung, sehingga mungkin masih lebih sesuai dengan kebutuhan Anda.

Untuk dapat menjalankan /bin/bashexecutable 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 menggunakan /usr/bin/timedan 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
Malte Skoruppa
sumber
Terima kasih, saya sangat mengerti mengapa itu tidak berhasil! Dua pertanyaan pendek, apa -fparameternya, saya tidak dapat menemukan ini. Kedua, apa artinya / bin / bash? Sangat menghargai itu!
P1nGu1n
1
The -fparameter untuk exportmemberitahu exportuntuk mengekspor fungsi shell. Lihat help export. The -fparameter untuk /usr/bin/timememberitahu /usr/bin/timemengharapkan format string, tapi aku menganggap ini Anda tahu. Bagian /bin/bashdari perintah terakhir adalah bash executable yang waktu eksekusi sebenarnya diukur, ketika itu sendiri mengeksekusi mkafungsi yang diekspor . Menjalankan mkafungsi karena membaca dan mengeksekusi mka -j8 baconperintah dari input standar, itulah sebabnya kami menggunakan echodan sebuah pipa. Maaf atas jawaban yang terlambat, baca saja ini. :)
Malte Skoruppa