निष्पादित / usr / बिन / समय ऐसी कोई फ़ाइल या निर्देशिका नहीं


11

मैं अपना Android रोम बना रहा हूं। इसे बनाने के लिए, मुझे दौड़ने की जरूरत है

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 चला रहा हूँ।

संपादित करें:

किसी कारण से, मेक के बजाय मेक का उपयोग करना काम करता है, हालांकि मका का उपयोग करना बेहतर है।

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

संपादित करें 2: से CyanogenMod वेबसाइट

आपके शेल से इनवाइट करना $ source build/envsetup.shया $ . build/envsetup.shबनाना डायरेक्ट्री में envsetup.sh स्क्रिप्ट चलाता है। envsetup.sh बिल्ड वातावरण में कई फ़ंक्शन जोड़ता है, जिनमें से सबसे महत्वपूर्ण नीचे सूचीबद्ध हैं।

source build/evnsetup.shवह कमांड है जिसे मैं समय से पहले चलाता हूं। Evnsetup.sh द्वारा उन जोड़े गए कार्यों में से एक है 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) का पूरा रास्ता डालने की कोशिश की है?
देसुआ

समस्या यह है कि evnsetup.sh कुछ सामान को इनिशियलाइज़ करता है। टर्मिनल में मुझे mka कॉल करने में सक्षम होने से पहले उस फ़ाइल को निष्पादित करना होगा। जाहिरा तौर पर इसे समय कमांड से एक पैरामीटर के रूप में कॉल करते समय मान्यता प्राप्त नहीं है।
P1nGu1n

मैं इसे कैसे पुन: पेश कर सकता हूं?
ब्राह्मम

आपके द्वारा निष्पादित किए जाने के बाद source build/evnsetup.sh, उस बिंदु पर जहां आप कॉल करना चाहते हैं time mka -j8 bacon, क्या आप कमांड का आउटपुट पोस्ट कर सकते हैं type mka?
माल्टे स्कॉरुप्पा

@MalteSkoruppa आउटपुट जोड़ा गया, mka एक बश फ़ंक्शन प्रतीत होता है?
P1nGu1n

जवाबों:


11

समस्या यह है कि mkaआपकी स्क्रिप्ट द्वारा निर्यात किया गया एक बैश फ़ंक्शन है और निष्पादन योग्य नहीं है (जैसा कि विरोध किया गया है make), इसलिए /usr/bin/timeइसे नहीं पाता है, क्योंकि यह एक निष्पादन योग्य दिखता है।

दो संभावित समाधान हैं।

सबसे पहले, ध्यान दें कि बैश बिल्ट-इन फ़ंक्शन 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बिल्ट-इन के लिए सहायता प्राप्त करने के लिए टाइप करें timeman timeनिष्पादन योग्य के लिए सहायता प्राप्त करने के लिए टाइप करें /usr/bin/time

पहला समाधान उपयोग करता है time, जबकि दूसरा समाधान उपयोग करता है /usr/bin/time

पहला समाधान: बाश बिल्ट-इन फ़ंक्शन का उपयोग करना time

बाॅश बिल्ट-इन फंक्शन time, घोषित बैश फंक्शन्स से अवगत है, और इस तरह के फंक्शन्स के समय को मापने के लिए आप तुरंत इसका इस्तेमाल कर सकते हैं।

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

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

आपके मामले में, निम्नलिखित कमांड काम करना चाहिए:

$ time mka -j8 bacon

यह मेरा पसंदीदा तरीका होगा। हालाँकि, यह आपके द्वारा इच्छित आउटपुट उत्पन्न नहीं कर सकता है। विशेष रूप से, यह सीपीयू उपयोग को मापता या प्रिंट नहीं करता है।

दूसरा समाधान: निष्पादन योग्य का उपयोग करना /usr/bin/time

आप सीधे निर्मित बैश फ़ंक्शन के समय को माप नहीं सकते हैं /usr/bin/time(जहाँ तक मुझे पता है), लेकिन आप जो कर सकते हैं, /bin/bashउस बैश फ़ंक्शन के निष्पादन योग्य समय को माप सकते हैं । यह एक छोटा सा हैकी है, और यह थोड़ा ओवरहेड उत्पन्न करता है क्योंकि आप एक अतिरिक्त उदाहरण लॉन्च कर रहे हैं bash। लेकिन यह ओवरहेड नगण्य हो सकता है जब एक ऐसे फ़ंक्शन का सामना करना पड़ता है जो गणना करने में मिनट लेता है, इसलिए यह अभी भी आपकी आवश्यकताओं के अनुरूप हो सकता है।

/bin/bashएक बैश फ़ंक्शन पर निष्पादन योग्य लॉन्च करने में सक्षम होने के लिए , हमें पहले फ़ंक्शन को निर्यात करना होगा।

$ 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

धन्यवाद, मैं वास्तव में समझता हूं कि यह काम क्यों नहीं कर रहा था! दो छोटे प्रश्न, -fपैरामीटर क्या करता है , मुझे यह पता नहीं चल पाया। दूसरा, क्या करता है / बिन / बैश? मैं इसकी प्रशंसा करता हूँ!
P1nGu1n

1
-fकरने के लिए पैरामीटर exportबताता है exportएक खोल समारोह निर्यात करने के लिए। देखते हैं help export-fकरने के लिए पैरामीटर /usr/bin/timeबताता है /usr/bin/timeएक प्रारूप स्ट्रिंग की उम्मीद है, लेकिन मैं यह तुम्हें पता है मान लेते हैं। /bin/bashपिछले आदेश का हिस्सा बैश निष्पादन जिसका निष्पादन समय वास्तव में मापा जाता है, जब वह खुद को निर्यात निष्पादित करता है mkaकार्य करते हैं। यह mkaफ़ंक्शन को निष्पादित करता है क्योंकि यह mka -j8 baconमानक इनपुट से कमांड को पढ़ता है और निष्पादित करता है , यही कारण है कि हम उपयोग करते हैं echoऔर एक पाइप। देर से जवाब के लिए क्षमा करें, बस इसे पढ़ें। :)
माल्टे स्कॉरुप्पा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.