GNU/Linux >> Znalost Linux >  >> Linux

Existuje způsob, jak zjistit dobu běhu posledního provedeného příkazu v shellu?

Nevím, jak je to v bash, ale v zsh lze definovat preexec a precmd funkce tak, že uloží aktuální čas do proměnných $STARTTIME (preexec) a $ENDTIME (precmd), takže budete moci najít přibližnou dobu běhu. Nebo můžete definovat accept-line funkci tak, že předřadí time před každým příkazem.

AKTUALIZACE :Toto je kód, který bude ukládat uplynulé časy do $_elapsed pole:

preexec () {
   (( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
   typeset -ig _start=SECONDS
}
precmd() { set -A _elapsed $_elapsed $(( SECONDS-_start )) }

Pak pokud spustíte sleep 10s :

% set -A _elapsed # Clear the times
% sleep 10s
% sleep 2s ; echo $_elapsed[-1]
10
% echo $_elapsed
0 10 0

Není potřeba ve čtyřech proměnných. Žádné problémy se jmény nebo další zpoždění. Všimněte si, že $_elapsed pole se může velmi zvětšit, takže musíte odstranit první položky (to se provádí pomocí následující části kódu:(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1] ).

AKTUALIZACE 2 :Nalezen skript pro podporu precmd a preexec ve stylu zsh v bash. Možná budete muset odstranit typeset -ig (Použil jsem jen k vynucení $_start být celé číslo) a nahradit set -A var ... s var=( ... ) aby to fungovalo. A já nevím, jak rozdělit pole a získat jejich délku v bash.

Skript:http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

AKTUALIZACE 3 :Nalezen jeden problém:pokud stisknete return s prázdným řádkem, preexec se nespustí, zatímco precmd ano, takže v $_elapsed získáte nesmyslné hodnoty pole. Chcete-li to opravit, nahraďte precmd funkci s následujícím kódem:

precmd () {
   (( _start >= 0 )) && set -A _elapsed $_elapsed $(( SECONDS-_start ))
   _start=-1 
}

Svět se možná trochu posunul od doby, kdy na tyto otázky odpověděli ostatní.

zsh má některé vestavěné funkce pro měření času, jak dlouho příkazy trvají.

Pokud povolíte možnost inc_append_history_time pomocí

setopt inc_append_history_time

Poté se čas potřebný ke spuštění každého příkazu uloží do vaší historie a poté jej lze zobrazit pomocí history -D .


Struktura této odpovědi:

  1. Neexistuje žádný předem připravený způsob, jak načasovat příkaz, který již byl spuštěn
  2. Existují způsoby, jak odvodit odhad doby trvání příkazu.
  3. Je zobrazen důkaz konceptu (počínaje hypotézou, že to nelze provést, a končící závěrem, že hypotéza byla chybná).
  4. Existují hacky, které můžete zavést předem a které zaznamenají uplynulý čas každého příkazu, který spustíte
  5. Závěr

Odpověď označená částmi podle výše uvedeného obrysu:

Část 1 - krátká odpověď je "ne"

Ne Promiň. Musíte použít time .

Část 2 - možná si můžete odvodit výsledek

V některých případech, pokud program zapisuje výstupní soubory nebo informace do souborů protokolu, můžete být schopni odvodit dobu běhu, ale to by bylo specifické pro program a pouze odhad. Pokud máte v Bash nastaven HISTTIMEFORMAT, můžete se podívat na záznamy v souboru historie, abyste získali představu o tom, kdy se program spustil. Čas ukončení se však nezaznamenává, takže dobu trvání můžete odvodit pouze v případě, že byl jiný program spuštěn bezprostředně poté, co skončil ten, který vás zajímá.

Část 3 - hypotéza je zfalšovaná

Hypotéza :Doba nečinnosti se bude počítat do uplynulého času

Zde je příklad pro ilustraci mého názoru. Je založeno na návrhu od ZyX , ale bylo by to podobné pomocí jiných metod.

V zsh :

% precmd() { prevstart=start; start=$SECONDS; }
% preexec() { prevend=$end; end=$SECONDS; }
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1491 ps: 1456 pe: 1458 s: 1459 e: 1491

Nyní počkáme... řekněme 15 sekund, pak:

% echo "T: $SECONDS"; sleep 10
T: 1506

Nyní počkáme... řekněme 20 sekund, pak:

% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1536 ps: 1492 pe: 1506 s: 1516 e: 1536

Jak vidíte, mýlil jsem se . Čas zahájení (1516) mínus předchozí čas ukončení (1506) je dobu trvání příkazu (sleep 10 ).

Hypotéza zfalšovaná - je možné získat správný uplynulý čas bez zahrnutí doby nečinnosti

Část 4 - hack pro záznam uplynulého času každého příkaz

Zde jsou ekvivalenty Bash k funkcím v ZyX odpověď (vyžadují skript, na který je odkaz):

preexec () {
   (( ${#_elapsed[@]} > 1000 )) && _elapsed=(${_elapsed[@]: -1000})
   _start=$SECONDS
}

precmd () {
   (( _start >= 0 )) && _elapsed+=($(( SECONDS-_start )))
   _start=-1 
}

Po instalaci preexec.bash (z propojeného skriptu) a vytvoření dvou výše uvedených funkcí by příklad spuštění vypadal takto:

$ _elapsed=() # Clear the times
$ sleep 10s
$ sleep 2s ; echo ${_elapsed[@]: -1}
10
$ echo ${_elapsed[@]}
0 10 2

Část 5 - závěr

Použijte time .


Linux
  1. Nejlepší způsob, jak zrušit všechny úlohy Slurm z výstupu příkazů Shell?

  2. CentOS / RHEL :Jak získat datum a čas provedeného příkazu ve výstupu příkazu historie

  3. Kde najdu zdrojový kód příkazu cp?

  1. adb:Najděte PID z prostředí adb

  2. Existuje způsob, jak změnit ID svazku souborů .iso z příkazového řádku?

  3. Existuje rychlý způsob, jak získat úplně poslední soubor ve velkém TAR?

  1. Aliasy příkazového řádku v prostředí Linux

  2. Najděte čas provedení příkazu nebo procesu v systému Linux

  3. Pointa externího příkazu `cd`?