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?

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.


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.


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.


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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.