Connect with us

Wie man

Verwendung des Befehls time unter Linux

So beenden Sie Prozesse vom Linux-Terminal aus

Fatmawati Achmad Zaenuri / Shutterstock.com

Möchten Sie wissen, wie lange ein Prozess läuft und vieles mehr? Das Linux time Der Befehl gibt Zeitstatistiken zurück und gibt Ihnen coole Einblicke in die von Ihren Programmen verwendeten Ressourcen.

Zeit hat viele Verwandte

Es gibt viele Linux-Distributionen und verschiedene Unix-ähnliche Betriebssysteme. Jedes von diesen hat eine Standardbefehlsshell. Die häufigste Standard-Shell in modernen Linux-Distributionen ist die Bash-Shell. Aber es gibt viele andere, wie die Z-Schale (zsh) und die Korn-Schale (ksh).

Alle diese Muscheln haben ihre eigenen time Befehl, entweder als eingebaut Befehl oder als reserviertes Wort. Wenn Sie tippen time In einem Terminalfenster führt die Shell ihren internen Befehl aus, anstatt die GNU zu verwenden time Binärdatei, die als Teil Ihrer Linux-Distribution bereitgestellt wird.

Wir möchten die GNU-Version von verwenden time weil es mehr hat Optionen und ist flexibler.

Welche Zeit wird laufen?

Sie können überprüfen, welche Version ausgeführt wird, indem Sie die type Befehl. type Hier erfahren Sie, ob die Shell Ihre Anweisung selbst mit ihren internen Routinen verarbeitet oder an die GNU-Binärdatei weiterleitet.

Geben Sie in ein Terminalfenster das Wort ein type, ein Leerzeichen und dann das Wort time und drücken Sie die Eingabetaste.

type time

Geben Sie time in ein Bash-Terminal-Fenster ein

Wir können das in der Bash-Shell sehen time ist ein reserviertes Wort. Dies bedeutet, dass Bash seine interne verwendettime Routinen standardmäßig.

type time

Geben Sie time in ein zsh-Terminalfenster ein

In der Z-Shell (zsh) time ist ein reserviertes Wort, daher werden standardmäßig die internen Shell-Routinen verwendet.

type time

Geben Sie time in ein Korn-Shell-Fenster ein

In der Kornschale time ist ein Schlüsselwort. Anstelle der GNU wird eine interne Routine verwendet time Befehl.

Ausführen des GNU-Zeitbefehls

Wenn die Shell auf Ihrem Linux-System eine interne hat time Routine müssen Sie explizit sein, wenn Sie die GNU verwenden möchten time binär. Sie müssen entweder:

  • Geben Sie den gesamten Pfad zur Binärdatei an, z /usr/bin/time. Führen Sie die aus which time Befehl, um diesen Pfad zu finden.
  • Verwenden command time.
  • Verwenden Sie einen Backslash wie time.

Zeitbefehlsausgabe in einem Terminalfenster

Das which time Befehl gibt uns den Pfad zur Binärdatei.

Wir können dies testen, indem wir /usr/bin/time als Befehl zum Starten der GNU-Binärdatei. Das funktioniert. Wir bekommen eine Antwort von der time Befehl, der uns mitteilt, dass wir keine Befehlszeilenparameter angegeben haben, an denen er arbeiten kann.

Tippen command time funktioniert auch und wir erhalten die gleichen Nutzungsinformationen von time. Das command Der Befehl weist die Shell an, den nächsten Befehl zu ignorieren, damit er außerhalb der Shell verarbeitet wird.

Verwendung einer Das Zeichen vor dem Befehlsnamen entspricht der Verwendung von command vor dem Befehlsnamen.

Der einfachste Weg, um sicherzustellen, dass Sie die GNU verwenden time binär ist die Verwendung der Backslash-Option.

time
time

Zeit und  Zeitausgabe in einem Terminalfenster

time ruft die Version der Zeit auf. time verwendet die time .

Verwenden des Zeitbefehls

Lassen Sie uns einige Programme zeitlich festlegen. Wir verwenden zwei Programme namens loop1 und loop2. Sie wurden aus loop1.c und loop2.c erstellt. Sie tun nichts Nützliches, außer die Auswirkungen einer Art von Codierungsineffizienz zu demonstrieren.

Dies ist loop1.c. Die Länge einer Zeichenfolge ist innerhalb der beiden verschachtelten Schleifen erforderlich. Die Länge wird im Voraus außerhalb der beiden verschachtelten Schleifen ermittelt.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, len, count=0;
 char szString[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 // get length of string once, outside of loops
 len = strlen( szString );  

 for (j=0; j<500000; j++) {

 for (i=0; i < len; i++ ) {

  if (szString[i] == '-')
    count++;
   }
 }

 printf("Counted %d hyphensn", count);

 exit (0);

} // end of main

Dies ist loop2.c. Die Länge der Zeichenfolge wird immer wieder für jeden Zyklus der äußeren Schleife ermittelt. Diese Ineffizienz sollte sich in den Timings zeigen.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, count=0;
 char szString[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 for (j=0; j<500000; j++) {

 // getting length of string every
 // time the loops trigger
 for (i=0; i < strlen(szString); i++ ) {

   if (szString[i] == '-')
    count++;
   }
 }

 printf("Counted %d hyphensn", count);

 exit (0);

} // end of main

Lassen Sie uns die starten loop1 programmieren und verwenden time um seine Leistung zu messen.

time ./loop1

Zeitergebnisse für loop1 in einem Terminalfenster

Jetzt machen wir dasselbe für loop2.

time ./loop2

Zeitausgabe für Schleife2 in einem Terminalfenster

Das hat uns zwei Ergebnissätze gegeben, aber sie haben ein wirklich hässliches Format. Wir können später etwas dagegen tun, aber lassen Sie uns ein paar Informationen aus den Ergebnissen auswählen.

Wenn Programme ausgeführt werden, gibt es zwei Ausführungsmodi, zwischen denen sie hin- und hergeschaltet werden. Diese heißen und.

Kurz gesagt, ein Prozess im Benutzermodus kann außerhalb seiner eigenen Zuordnung nicht direkt auf Hardware oder Referenzspeicher zugreifen. Um Zugriff auf solche Ressourcen zu erhalten, muss der Prozess Anforderungen an den Kernel stellen. Wenn der Kernel die Anforderung genehmigt, wechselt der Prozess in die Ausführung des Kernelmodus, bis die Anforderung erfüllt ist. Der Prozess wird dann wieder in die Benutzermodusausführung umgeschaltet.

Die Ergebnisse für loop1 Sag uns das loop1 verbrachte 0,09 Sekunden im Benutzermodus. Entweder hat es keine Zeit im Kernel-Modus verbracht oder die Zeit im Kernel-Modus ist zu niedrig, um registriert zu werden, sobald es abgerundet wurde. Die insgesamt verstrichene Zeit betrug 0,1 Sekunden. loop1 erhielt durchschnittlich 89% der CPU-Zeit über die Dauer seiner gesamten verstrichenen Zeit.

Das ineffiziente loop2 Die Ausführung des Programms dauerte dreimal länger. Die verstrichene Gesamtzeit beträgt 0,3 Sekunden. Die Verarbeitungszeit im Benutzermodus beträgt 0,29 Sekunden. Für den Kernel-Modus wird nichts registriert. loop2 erhielt durchschnittlich 96% der CPU-Zeit für die Dauer seines Laufs.

Formatieren der Ausgabe

Sie können die Ausgabe von anpassen time Verwenden einer Formatzeichenfolge. Die Formatzeichenfolge kann Text- und Formatspezifizierer enthalten. Die Liste der Formatbezeichner kann sein auf der Manpage gefunden zum time. Jeder der Formatbezeichner repräsentiert eine Information.

Wenn die Zeichenfolge gedruckt wird, werden die Formatbezeichner durch die tatsächlichen Werte ersetzt, die sie darstellen. Der Formatbezeichner für den Prozentsatz der CPU ist beispielsweise der Buchstabe P . Um anzuzeigen time Wenn ein Formatbezeichner nicht nur ein regulärer Buchstabe ist, fügen Sie ihm ein Prozentzeichen hinzu %P . Verwenden wir es in einem Beispiel.

Das -f Die Option (Format String) wird verwendet, um zu sagen time Das Folgende ist eine Formatzeichenfolge.

Unsere Formatzeichenfolge druckt die Zeichen „Programm:“ und den Namen des Programms (sowie alle Befehlszeilenparameter, die Sie an das Programm übergeben). Das %C Der Formatbezeichner steht für „Name und Befehlszeilenargumente des zeitgesteuerten Befehls“. Das n Bewirkt, dass die Ausgabe in die nächste Zeile wechselt.

Es gibt viele Formatspezifizierer, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Stellen Sie daher sicher, dass Sie sie korrekt eingeben, wenn Sie dies für sich selbst tun.

Als nächstes drucken wir die Zeichen „Gesamtzeit:“, gefolgt vom Wert der insgesamt verstrichenen Zeit für diesen Programmlauf (dargestellt durch %E).

Wir gebrauchen n eine neue Zeile zu geben. Anschließend drucken wir die Zeichen „Benutzermodus (e)“, gefolgt vom Wert der im Benutzermodus verbrachten CPU-Zeit, angegeben durch %U.

Wir gebrauchen n eine neue Zeile zu geben. Dieses Mal bereiten wir uns auf den Kernel-Zeitwert vor. Wir drucken die Zeichen „Kernel Mode (s)“, gefolgt von der Formatangabe für die CPU-Zeit, die im Kernel-Modus verbracht wird %S.

Schließlich werden wir die Zeichen drucken “nCPU: ”, um uns eine neue Zeile und den Titel für diesen Datenwert zu geben. Das %P Der Formatbezeichner gibt den durchschnittlichen Prozentsatz der CPU-Zeit an, die vom zeitgesteuerten Prozess verwendet wird.

Die gesamte Formatzeichenfolge wird in Anführungszeichen gesetzt. Wir hätten einige aufnehmen können t Zeichen zum Platzieren von Tabulatoren in der Ausgabe, wenn wir uns über die Ausrichtung der Werte Gedanken gemacht haben.

time -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1

Ausgabe der Formatzeichenfolge für loop1 in einem Terminalfenster

Senden der Ausgabe an eine Datei

Um die Timings der von Ihnen durchgeführten Tests aufzuzeichnen, können Sie die Ausgabe von senden time zu einer Datei. Verwenden Sie dazu die -o (Ausgabe-) Option. Die Ausgabe Ihres Programms wird weiterhin im Terminalfenster angezeigt. Es ist nur die Ausgabe von time das wird in die Datei umgeleitet.

Wir können den Test erneut ausführen und die Ausgabe im speichern test_results.txt Datei wie folgt:

time -o test_results.txt -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1
cat test_results.txt

Ausgabe der Formatzeichenfolge für loop1, die in einem Terminalfenster an die Datei weitergeleitet wird

Das loop1 Die Programmausgabe wird im Terminalfenster angezeigt und die Ergebnisse von time geh zum test_results.txt Datei.

Wenn Sie die nächsten Ergebnisse in derselben Datei erfassen möchten, müssen Sie die verwenden -a Option (anhängen) wie folgt:

time -o test_results.txt -a -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop2
cat test_results.txt

Ausgabe der Formatzeichenfolge für loop2, die an die Datei in einem Terminalfenster angehängt wird

Es sollte jetzt klar sein, warum wir das verwendet haben %C Formatbezeichner, um den Namen des Programms in die Ausgabe der Formatzeichenfolge aufzunehmen.

Und wir haben keine Zeit mehr

Wahrscheinlich am nützlichsten für Programmierer und Entwickler, um ihren Code zu optimieren time Der Befehl ist auch nützlich für alle, die bei jedem Programmstart mehr über die Vorgänge unter der Haube erfahren möchten.

Continue Reading
Click to comment

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Tendencia