Nessun file o directory durante l'esecuzione di / usr / bin / time


11

Sto costruendo la mia rom android. Per costruirlo, devo correre

mka -j8 bacon

Tuttavia, volevo misurare il tempo impiegato per costruirlo, quindi l'ho usato

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

Questo non funzionerà, perché sta dicendo

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

Qualsiasi aiuto su come aggirare questo, è apprezzato! Sto eseguendo xubuntu.

Modificare:

Per qualche ragione, usare make al posto di mka funziona, tuttavia usare mka è meglio.

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

Modifica 2: dal sito web cyanogenmod

Invocando $ source build/envsetup.sho $ . build/envsetup.shdalla shell si esegue lo script envsetup.sh nella directory di generazione. envsetup.sh aggiunge molte funzioni all'ambiente di compilazione, le più importanti delle quali sono elencate di seguito.

source build/evnsetup.shè il comando che eseguo prima dell'esecuzione del tempo. Una di quelle funzioni aggiunte da evnsetup.sh è mka, è possibile chiamarlo dal timecomando?

Modifica 3: output di tipo 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
}

Hai provato a mettere l'intero percorso di mka (qualcosa come / usr / bin / mka)?
— desgua,

Il problema è che evnsetup.sh inizializza alcune cose. Nel terminale devo eseguire quel file prima di poter chiamare mka. Apparentemente non viene riconosciuto quando lo si chiama come parametro dal comando time.
— P1nGu1n

Come posso riprodurlo?
— Braiam

Dopo aver eseguito il tuo source build/evnsetup.sh, nel punto in cui desideri chiamare time mka -j8 bacon, puoi pubblicare l'output del comando type mka?
— Malte Skoruppa

Aggiunto l'output di @MalteSkoruppa, mka sembra essere una funzione bash?
— P1nGu1n

Risposte:


11

Il problema è che mkaè una funzione bash esportata dal tuo script e non un eseguibile (al contrario di make), quindi /usr/bin/timenon la trova, in quanto cerca un eseguibile.

Esistono due possibili soluzioni.

Innanzitutto, nota che c'è una differenza tra la funzione integrata bash timee l'eseguibile /usr/bin/time. Questi sono comandi diversi, che accettano parametri diversi e generano output diversi:

$ 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

Digita help timeper ottenere assistenza per il bash integrato time. Digitare man timeper ottenere aiuto per l'eseguibile /usr/bin/time.

La prima soluzione utilizza time, mentre la seconda soluzione utilizza /usr/bin/time.

Prima soluzione: usare la funzione integrata bash time

La funzione integrata bash timeè a conoscenza delle funzioni dichiarate bash e puoi usarla immediatamente per misurare il tempo di tali funzioni.

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

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

Nel tuo caso, il seguente comando dovrebbe funzionare:

$ time mka -j8 bacon

Questo sarebbe il mio modo preferito. Tuttavia, potrebbe non generare esattamente l'output desiderato. In particolare, non misura né stampa l'utilizzo della CPU.

Seconda soluzione: usare l'eseguibile /usr/bin/time

Non puoi misurare direttamente il tempo di una funzione bash integrata usando /usr/bin/time(per quanto ne so), ma quello che puoi fare è misurare il tempo /bin/bashdell'eseguibile che esegue quella funzione bash. Questo è un po 'confuso, e genera un leggero sovraccarico mentre stai lanciando un'istanza aggiuntiva di bash. Ma questo sovraccarico può essere trascurabile di fronte a una funzione che richiede minuti per il calcolo, quindi può comunque soddisfare meglio le tue esigenze.

Per poter avviare l' /bin/basheseguibile su una funzione bash, dobbiamo prima esportare la funzione.

$ 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

Quindi, nel tuo caso, per poter utilizzare /usr/bin/timee generare il formato di output desiderato, puoi procedere come segue:

$ 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

Grazie, capisco davvero perché non ha funzionato! Due brevi domande, qual è il -fparametro, non sono riuscito a trovarlo. Secondo, cosa significa / bin / bash? Lo apprezzo davvero!
— P1nGu1n

1
Il -fparametro per exportdire exportdi esportare una funzione di shell. Vedere help export. Il -fparametro per /usr/bin/timedire /usr/bin/timedi aspettarsi una stringa di formato, ma presumo che tu lo sappia. La /bin/bashparte dell'ultimo comando è l'eseguibile bash il cui tempo di esecuzione è effettivamente misurato, quando esegue la mkafunzione esportata . Esegue la mkafunzione perché legge ed esegue il mka -j8 baconcomando dall'input standard, motivo per cui usiamo echoe una pipe. Ci scusiamo per la risposta tardiva, basta leggere questo. :)
— Malte Skoruppa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.