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.