Millisekunden von der Solaris-Befehlszeile

3

Mit diesem Gnu Date-Befehl kann ich Millisekunden auf folgende Weise abrufen:

date +%M:%S.%N;

aber dieser befehl funktioniert nicht auf solaris ... irgendwelche ideen?

andersonbd1
quelle

Antworten:

5

Dieses "Shell-Skript" sollte Millisekunden anzeigen:

#!/bin/ksh
if [ ! -x /var/tmp/time_ms ]
then
    cat > /tmp/time_ms.c << %
    #include <sys/time.h>
    main()
    {
        struct timeval tv;
        gettimeofday(&tv,(void*)0);
        printf("%d.%d\n",tv.tv_sec,tv.tv_usec/1000);
    }
%
    PATH=$PATH:/usr/sfw gcc /tmp/time_ms.c -o /var/tmp/time_ms
fi
/var/tmp/time_ms

Natürlich können Sie time_ms in Ihrem PATH verschieben und direkt nach dem ersten Lauf aufrufen. Das wird eine schnellere Lösung als Gnu Date oder irgendein Perl / Was auch immer-Skript liefern.

jlliagre
quelle
hey hey - das sieht nach einer schönen Idee aus, jiliagre. Ich erhalte jedoch den folgenden Fehler: ./time_ms.sh[2]: Syntaxfehler in Zeile 4: "<<", keine übereinstimmenden Ideen?
andersonbd1
Ich habe mein Skript so korrigiert, dass es mit älteren ksh- und anderen Shells funktioniert. Es funktionierte gut mit ksh93, also habe ich es nicht bemerkt.
Juli
yep - sehr cool.
andersonbd1
2

Die wahrscheinlichste Erklärung ist, dass Solaris kein GNU-Datum verwendet oder nicht die neueste Version hat. In der Solaris-Manpage für Datum wird die %NFormatierungsoption nicht erwähnt . Das GNU-Dokument coreutils für die Zeitkonvertierung gibt an date, dass %Nes sich um eine GNU-Erweiterung handelt (oh, es sind Nanosekunden, keine Millisekunden).

Wenn Sie die Millisekunden benötigen, ist es am besten, die neuesten GNU-Coreutils herunterzuladen und unter zu installieren /usr/local(oder /opt/localwenn Sie es vorziehen). Um die richtige Version von zu erhalten date, konfigurieren Sie Ihre entweder PATHso, dass sie /usr/local/binvorher kommt, /usr/binoder verwenden Sie einen vollständigen Pfad zu /usr/local/bin/datein Ihrem Skript.

Doug Harris
quelle
Ich bin nicht der Sysadmin. Gibt es keinen anderen Solaris-Befehl, um dies zu tun?
andersonbd1
Ich bin mir ziemlich sicher, dass Sie coreutilsin Ihrem Home-Verzeichnis installieren können . Sie können auch Aaron Digullas Perl-Vorschlag ausprobieren.
Doug Harris
Was bekommst du, wenn du dies in bash eingibst type -a date?
Doug Harris
Ich versuche jetzt, coreutils in mein Home-Verzeichnis zu kopieren ... $ type -a Datum Datum ist / usr / bin / Datum Datum ist / bin / Datum
andersonbd1
1
Ich habe es auch versucht. Ich habe es getan ./configure --prefix=/home/myuser. Coreutils Dateien installiert wurden in bin, libund shareUnterverzeichnisse unter meinem Home - Verzeichnis.
Doug Harris
1

Wenn Sie die Zeit messen, die ein Teil des Skripts benötigt, können Sie diesen Teil des Skripts in eine Funktion einfügen und aufrufen time myfunction. Sie können das timeseingebaute Element auch vor und nach dem Abschnitt aufrufen, für den Sie eine Zeitangabe festlegen möchten, aber das Rechnen selbst ist ein bisschen mühsam.

Gilles
quelle
1
#!/usr/bin/bash

TSP_MSEC=`perl -MTime::HiRes -e 'print int(1000 * Time::HiRes::gettimeofday),"\n"'`
MSEC=`echo $TSP_MSEC | cut -c11-13`

TSP=`date +%d.%m.20%y" "%H:%M:%S.$MSEC`
echo $TSP

Ergebnis: 15.07.2014 16: 10: 01.260

Dr. Michael Bobsien
quelle
0

Perl ist fast überall. Verwenden:

perl -e 'print time()*1000;print "\n";'

Wenn Sie wirklich Millisekundengenauigkeit benötigen, probieren Sie das Time:HiResModul aus .

[EDIT] Kompilieren Sie alternativ ein kleines C-Programm, das gettimeofday()das Ergebnis aufruft und druckt.

Aaron Digulla
quelle
Ich messe Millisekunden in einem Bash-Skript. Ich vermute, das Starten des Perl-Interpreters würde genug Zeit in Anspruch nehmen, um meine Berechnungen zu verwerfen.
andersonbd1
1
Dann benutze direkt gettimeofday (). Oder der timeBefehl für diese Angelegenheit.
Aaron Digulla