Linux'ta zamanı milisaniye olarak almak için bir kabuk komutu var mı?
date -Ins
Linux'ta zamanı milisaniye olarak almak için bir kabuk komutu var mı?
date -Ins
Yanıtlar:
date +%s%N
saniye sayısını + geçerli nanosaniyeyi döndürür.
Bu nedenle, echo $(($(date +%s%N)/1000000))
ihtiyacınız olan şey budur.
Misal:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
faydalıysa, çağdan bu yana geçen saniye sayısını döndürür.
%N
desteklenmiyordate
date +%s%3N
daha hızlı (@ michael-defort'un cevabına dayanarak)
coreutils
MacPorts veya Homebrew kullanmanın bir parçası olarak tarihin GNU sürümünü yüklemeniz gerekir - ardından gdate
komutu kullanın. Bu soruya bakın: stackoverflow.com/questions/9804966/…
date +"%T.%N"
geçerli saati nanosaniye ile döndürür.
06:46:41.431857000
date +"%T.%6N"
mikrosaniye olan ilk 6 basamağa yuvarlanmış nanosaniye ile geçerli saati döndürür.
06:47:07.183172
date +"%T.%3N"
geçerli saati, milisaniye olan ilk 3 basamağa yuvarlanmış nanosaniye ile döndürür.
06:47:42.773
Genel olarak, date
komut formatının her alanına isteğe bağlı bir alan genişliği verilebilir.
%xN
: alan genişliği için güzel bir tane!
Nano 10 −9 ve milli 10 −3'tür . Bu nedenle, milisaniye almak için nanosaniyelerin ilk üç karakterini kullanabiliriz:
date +%s%3N
Gönderen man date
:
% N nanosaniye (000000000..999999999)
1970-01-01 00:00:00 UTC'den bu yana % s saniye
Kaynak: Sunucu Arızası Bash'deki milisaniye cinsinden geçerli Unix saatini nasıl alabilirim? .
Bayrağı date
desteklemeyen OS X'te Homebrew kullanarak %N
yüklemenizi öneririm . Bu , Linux sistemlerinde olduğu gibi davranacak adlı bir komuta erişmenizi sağlayacaktır .coreutils
gdate
date
brew install coreutils
Daha "yerel" bir deneyim için bunu her zaman aşağıdakilere ekleyebilirsiniz .bash_aliases
:
alias date='gdate'
Sonra yürütün
$ date +%s%N
Milisaniye içinde zaman kazanmak için Linux için bir şekilde taşınabilir bir kesmek:
#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3 # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"
millisec=$(( 10*(t2-t1) ))
echo $millisec
Çıktı:
3010
Bu, kabuk iç kısımları ve procfs ile çalışan çok ucuz bir işlemdir.
date
komutu OS X'de milisaniye sağlamadı, bu yüzden python'dan bir takma ad kullanıldı
millis(){ python -c "import time; print(int(time.time()*1000))"; }
VEYA
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
ayrı bir işlemi bitirdikten sonra exec
Python yorumcunuzu düzenledikten sonra kitaplıklarını yüklemesine / başlatmasına, sonucunu yazmasına ve çıkmasına izin verin, bu sonuç artık doğru olmayacaktır.
Diğer cevaplar muhtemelen çoğu durumda yeterlidir, ancak bir BusyBox sisteminde bir sorunla karşılaştığımda iki sentimi ekleyeceğimi düşündüm .
Söz konusu sistem %N
format seçeneğini desteklemedi ve Python veya Perl yorumlayıcısı yok.
Çok kafa tırmalamadan sonra, biz (teşekkürler Dave!) Bu ile geldi:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
adjtimex
(Normalde sistem saati için seçenekleri ayarlamak için kullanılır) çıkışından saniye ve mikrosaniye ayıklar ve yeni satırlar olmadan yazdırır (böylece birlikte yapıştırılır). Mikrosaniye alanının sıfırlarla önceden doldurulması gerektiğini unutmayın, ancak bu yine de altı basamaktan uzun saniye alanını etkilemez. Bundan mikrosaniyeyi milisaniyeye dönüştürmek önemsiz olmalıdır.
Sondaki yeni bir satıra ihtiyacınız varsa (belki daha iyi göründüğü için)
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Ayrıca bunun gerekli olduğunu adjtimex
ve awk
mevcut olduğunu da unutmayın . Değilse, o zaman BusyBox ile bunları yerel olarak işaret edebilirsiniz:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Ve sonra yukarıdaki
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Ya da elbette onları PATH
DÜZENLE:
Yukarıdaki BusyBox cihazımda çalıştı. Ubuntu'da aynı şeyi denedim ve adjtimex
farklı versiyonları olduğunu fark ettim . Ubuntu'da bu, ondalık basamaklarla saniye cinsinden süreyi mikrosaniyeye çıkarmak için çalıştı (yeni bir satır dahil)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Bunu Ubuntu üzerinde yapmazdım. Kullanmak istiyorumdate +%s%N
Perl bunun için, hatta AIX gibi egzotik platformlarda bile kullanılabilir. Misal:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(gettimeofday);
my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime ($t_sec);
printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
Bunun gibi bir Python betiği:
import time
cur_time = int(time.time()*1000)
time.time()
en azından macOS'ta 6 ondalık basamağa döner.
Ben sadece Alper'in cevabına bu şeyleri çalıştırmak için ne yapmam gerektiğini eklemek istedim :
Mac'te brew install coreutils
kullanabilmemiz için ihtiyacınız olacak gdate
. Aksi takdirde Linux'ta, sadece date
. Ve bu işlev, geçici dosyalar veya herhangi bir şey oluşturmak zorunda kalmadan komutları zamanlamanıza yardımcı olacaktır:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Ve bir dize ile kullanabilirsiniz:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Sürüm 4.1'den beri GNU AWK kullandığınızda, zaman kitaplığını yükleyebilir ve şunları yapabilirsiniz:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Bu işlem, 1970-01-01T00: 00: 00'dan bu yana saniye cinsinden geçerli saati, saniye altı hassasiyetle basacaktır.
the_time = gettimeofday()
Süreyi 1970-01-01 UTC'den bu yana geçen süreyi kayar nokta değeri olarak saniye cinsinden döndürün. Bu platformda zaman yoksa, geri dönün-1
ve ayarlayınERRNO
. Döndürülen süre ikinci saniyeden daha düşük bir hassasiyete sahip olmalıdır , ancak gerçek hassasiyet platforma göre değişebilir.gettimeofday()
Bu platformda standart C sistem çağrısı mevcutsa, değeri döndürür. Aksi takdirde, MS-Windows üzerinde ise kullanmaya çalışırGetSystemTimeAsFileTime()
.Kaynak: GNU awk manual
Linux sistemlerinde, standart C işlevi getimeofday()
süreyi mikrosaniye hassasiyetinde döndürür.
Tarihi saat ve saat dilimi ile göstermek için
tarih + "% d-% m-% Y% T.% N% Z"
Çıktı: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
Sana nanosaniye verirdi, bununla çalışabilir misin?