/ Usr / bin / time yürütülürken böyle bir dosya veya dizin yok


11

Kendi android romumu oluşturuyorum. İnşa etmek için koşmam gerek

mka -j8 bacon

Ancak, inşa etmek için geçen zamanı ölçmek istedim, bu yüzden kullandım

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

Bu olmayacak, çünkü diyor ki

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

Bu sorunu çözmek için herhangi bir yardım, takdir! Ben xubuntu kullanıyorum.

Düzenle:

Bazı nedenlerden dolayı, mka yerine make kullanmak işe yarar, ancak mka kullanmak daha iyidir.

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

Düzenleme 2: gelen cyanogenmod web

Çağırma $ source build/envsetup.shveya $ . build/envsetup.shsizin kabuğundan inşa dizininde envsetup.sh komut çalıştırır. envsetup.sh, en önemlileri aşağıda listelenen oluşturma ortamına birçok işlev ekler.

source build/evnsetup.shzamanı çalıştırmadan önce çalıştırdığım komuttur. Evnsetup.sh tarafından eklenen bu işlevlerden biri mka, bunu timekomut içinden çağırmak mümkün mü?

Düzenleme 3: Çıktı tipi 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
}

Tüm mka yolunu (/ usr / bin / mka gibi) koymaya çalıştınız mı?
desgua

Sorun şu ki, evnsetup.sh bazı şeyler başlatır. Terminalde mka'yı çağıramadan önce bu dosyayı yürütmem gerekiyor. Görünüşe göre, zaman komutundan bir parametre olarak çağrıldığında tanınmıyor.
P1nGu1n

Bunu nasıl çoğaltabilirim?
Braiam

Aradıktan sonra source build/evnsetup.sh, aramak istediğiniz noktada time mka -j8 bacon, komutun çıktısını gönderebilir misiniz type mka?
Malte Skoruppa

@MalteSkoruppa çıktı eklendi, mka bir bash işlevi gibi görünüyor?
P1nGu1n

Yanıtlar:


11

Sorun şu ki mka, komut dosyanız tarafından dışa aktarılan bir bash işlevidir ve bir yürütülebilir dosya (aksine make), bu yüzden /usr/bin/timebir yürütülebilir dosya ararken bulamaz.

İki olası çözüm vardır.

İlk olarak, bash yerleşik işlevi timeile yürütülebilir dosya arasında bir fark olduğunu unutmayın /usr/bin/time. Bunlar, farklı parametreler alan ve farklı çıktılar üreten farklı komutlardır:

$ 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

Tip help timeyerleşik partisi yüzünden yardım almak için time. Tip man timeyürütülebilir için yardım almak için /usr/bin/time.

İlk çözüm kullanılırken time, ikinci çözüm kullanılır /usr/bin/time.

İlk çözüm: bash yerleşik işlevini kullanma time

Bash yerleşik işlevi time, bildirilen bash işlevlerinin farkındadır ve bu işlevlerin zamanını ölçmek için hemen kullanabilirsiniz.

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

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

Sizin durumunuzda, aşağıdaki komutun çalışması gerekir:

$ time mka -j8 bacon

Bu benim tercih ettiğim yol olurdu. Ancak, tam olarak istediğiniz çıktıyı üretmeyebilir. Özellikle, CPU kullanımını ölçmez veya yazdırmaz.

İkinci çözüm: yürütülebilir dosyayı kullanma /usr/bin/time

Yerleşik bir bash işlevinin zamanını ( /usr/bin/timebildiğim kadarıyla) kullanarak doğrudan ölçemezsiniz , ancak yapabileceğiniz şey, /bin/bashbu bash işlevini yürüten yürütülebilir dosyanın süresini ölçmektir . Bu biraz acayip ve fazladan bir örnek başlatırken biraz ek yük oluşturur bash. Ancak bu ek yük, hesaplanması dakikalar süren bir işlevle karşılaştığında önemsiz olabilir, bu nedenle yine de ihtiyaçlarınızı daha iyi karşılayabilir.

/bin/bashBir bash işlevinde yürütülebilir dosyayı başlatabilmek için önce işlevi dışa aktarmamız gerekir.

$ 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

Bu nedenle, sizin durumunuzda, /usr/bin/timeistediğiniz çıktı biçimini kullanabilmek ve oluşturabilmek için aşağıdaki işlemleri yapabilirsiniz:

$ 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

Teşekkür ederim, neden işe yaramadığını gerçekten anlıyorum! İki kısa soru, -fparametre ne yapar , bunu bulamadım. İkincisi, / bin / bash ne işe yarar? Gerçekten takdir ediyorum!
P1nGu1n

1
-fParametre exportsöyler exportbir kabuk işlevi ihracat. Bkz help export. -fParametre /usr/bin/timesöyler /usr/bin/timebir biçim dizesi beklemek, ama bilmeni bu varsayıyorum. /bin/bashSon komutun bir parçası olan uygulama süresi gerçekte ölçülen, kendisini dışa yürütür Bash çalıştırılabilir mkaişlevi. O yürütür mkaokur ve yürütür çünkü işlevini mka -j8 baconstandart kullandığımız yüzden girdi, gelen komutu echove bir boru. Geç cevap için özür dilerim, bunu okuyun. :)
Malte Skoruppa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.