Når man arbejder med Linux-terminalen, har man nogle gange brug for at vide, hvornår bestemte kommandoer blev udført, f.eks. for at spore problemer. Der findes et værktøj kaldet time
til dette formål. Vi vil fortælle dig, hvordan Linux-kommandoen time
fungerer, og hvad dens syntaks er. Derefter går vi videre til beskrivelsen af de tilgængelige muligheder. Og til sidst nævner vi nogle populære brugsscenarier.
Værktøjet kører en brugerdefineret kommando og viser derefter oplysninger om dens udførelsestid. Syntaksen er ganske praktisk. Først skal du angive indstillingerne for tid
, så den kommando, der skal udføres, og til sidst argumenterne for den:
$ time [options] command_to_execute [arguments]
Lad os se på listen over tilgængelige indstillinger:
-o
, --output
- gemmer data i den valgte fil i stedet for standardoutputtet i terminalen. I dette tilfælde vil de gamle data i filen blive overskrevet.-a
, --append
- tilføj ny information til filen i stedet for at overskrive den gamle. Indstillingen er kun nyttig i kombination med -o
.-f
, --format
- vælg et bestemt outputformat. Detaljer om formatering er beskrevet i næste afsnit af denne artikel.-p
, --profitably
- brug et dataoutputformat i overensstemmelse med POSIX 1003.2-standarden.-v
, --verbose
- udsender detaljerede oplysninger om udførelsen af programmet.-V
, --version
- viser versionen af tidsværktøjet
.Denne liste indeholder kun de grundlæggende indstillinger. Du kan få detaljerede oplysninger med kommandoen:
$ man time
Som standard kan time
outputte information i en form, der ikke er behagelig at læse,
Det er ønskeligt at indstille outputformateringsindstillinger for det, som vil blive diskuteret nu. Der er tre af dem i alt. Lad os tage kommandoen apt-get update
som et eksempel.
Indstillingen -v
bruges til at sende detaljerede oplysninger:
$ sudo time -v apt-get update
Indstillingen -p
er nødvendig for at udlæse data i et POSIX 1003.2-kompatibelt format:
$ sudo time -p apt-get update
Formateringsdatalinjen indeholder typisk ressourcespecifikatorer og almindelig tekst. %-tegnet
angiver, at det efterfølgende tegn skal behandles som en ressourcespecifikator.
-tegnet
bruges til at angive afgrænsningstegnet. Der er tre tilgængelige muligheder: t
- tabulator, n
- ny linje, \
- backslash. Hvis du angiver et andet tegn efter , vil terminalen vise et spørgsmålstegn (
?
), hvilket indikerer en inputfejl.
Resten af teksten i formatstrengen kopieres helt ind i outputfeltet. I dette tilfælde begynder time
altid at udlæse data fra en ny linje efter oplysningerne om udførelsen af selve kommandoen.
Lad os se på de tilgængelige ressourcespecifikatorer:
%
- bogstavelig %, dvs. for at udskrive et procenttegn skal du angive %% i kommandoen.C
- kommandonavn og anvendte argumenter.D
- gennemsnitlig størrelse på det uopdelte dataområde. Den vises i kilobyte.E
- realtid for udførelse af kommandoen i det sædvanlige timeformat. Det vises som [timer:]<minutter:sekunder.
N
- antal større fejl eller I/O-fejl, der opstod under udførelsen af processen.I
- antal adgange til filsystemet.K
- gennemsnitsværdi for hukommelse brugt til kode(tekst)
, initialiserede data(data)
ogstak (stak
). Den vises i kilobyte.M
- maksimal størrelse på resident-sættet under proceskørsel i kilobyte.O
- antal filsystem-exits.P
- procentdel af CPU-belastning (central processing unit).R
- antal mindre fejl.S
- tid i sekunder, hvor CPU'en blev brugt af systemet på vegne af processen i supervisor-tilstand(kernel-tilstand)
.U
- tid i sekunder, hvor CPU'en blev brugt af processen direkte ibrugertilstand
.W
- hvor mange gange processen blev aflæst fra RAM.Z
- systemets sidestørrelse. Denne værdi er en konstant, men den varierer fra system til system.c
- antal ufrivillige kontekstskift under processens udførelse.e -
realtid for kommandoudførelse i det sædvanlige timeformat. Den vises i sekunder.k
- antal signaler, der nåede frem til processen.p
- gennemsnitlig størrelse af processens ikke-delte stak, i kilobyte.r
- antal modtagne socket-meddelelser.s
- antal sendte socket-meddelelser.t
- gennemsnitlig størrelse af processens resident set, i kilobyte.w
- antal frivillige kontekstskift under processens udførelsex
- returkode for kommandoen.Dette var alle de ressourcespecifikationer, der blev brugt, da vi valgte formateringen for tid
. Lad os nu gå videre til scenarierne for brug af kommandoen.
Lad os se på tre grundlæggende eksempler, som er ret almindeligt brugt: output til terminalen, output til en separat fil og output med formatering.
Som eksempel vil vi tage sleep-kommandoen, som holder pause i et bestemt tidsrum. Det vil være et meget tydeligt eksempel, fordi pausetiden falder sammen med kommandoudførelsestiden i tid
:
$ time sleep 3
Tiden står umiddelbart i tre kolonner. Lad os gennemgå hver af dem:
real
- den samlede tid fra starten af processens udførelse til dens afslutning.
user
- den tid, hvor processen kørte ibrugertilstand
.
sys
- den tid, hvor processen var involveret i supervisor-tilstand(kernel-tilstand)
.
Det næste nyttige scenarie er at udlæse den tid, det tager at indlæse en websides header via curl-værktøjet
. Lad os tage vores hjemmeside som eksempel:
$ time curl -I https://losst.ru
Vi bør nævne en situation, hvor udførelsen af kommandoen sætter terminalvinduet i en anden tilstand, f.eks. når du kører nano-editoren for at ændre filen /home/root-user/script.txt
:
$ time nano /home/root-user/scripts/main_script.txt
Når editoren er færdig, kan du se den samlede tid, du har arbejdet på filen.
Nu ved du, hvordan du kan se udførelsestiden for en Linux-kommando.
Oplysningerne om resultaterne af tidskommandoen kan gemmes i en separat fil ved hjælp af indstillingen-o
. I så fald vil de ikke blive vist i terminalvinduet. Lad os tage et eksempel, hvor vi udpakker indholdet af ~/data/data.tar.gz-arkivet
ved hjælp af tar-værktøjet
. Lad os gemme oplysninger om udførelsestiden i en ny fil ~/data/data_data_time.txt.
Vi tilføjer også muligheden
v til kommandoen for at få detaljerede oplysninger:
$ sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
Filen vil have følgende indhold.
Hvis du bruger optionen -o
, skal du huske, at den overskriver de gamle oplysninger i outputfilen med de nye oplysninger. Det kan bruges, når man opretter nye filer, men er ikke egnet til logning. Med den valgfrie indstilling -a erstattes overskrivningen af indholdet med tilføjelse af nye oplysninger:
$ sudo time -v -a -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
Den oprindelige mulighed for at formatere data er ikke egnet i alle tilfælde. Som eksempel tager vi den tidligere anvendte kommando til at udtrække et arkiv, men vi vil ikke gemme dataene i en fil. Når vi udfører den, er vi interesserede i:
specifikatoren%C
. specifikation%P
. specifier%e
.For at gøre det nemmere at se, vil hvert element blive vist på en separat linje ved hjælp af separatoren n
. Samtidig vil de alle blive underskrevet på en forståelig måde.
Sådan ser den endelige version af kommandoen ud:
sudo time -f "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data
Al tekst undtagen tegnene efter %
vises fuldt ud i terminalen. Dette er en praktisk måde at markere