Pertanyaan
Saya ingin dapat menjalankan perintah UNIX dengan tepat setiap detik dalam jangka waktu yang lama .
Saya membutuhkan solusi, yang tidak ketinggalan setelah waktu tertentu, karena waktu yang dibutuhkan oleh perintah itu sendiri untuk dieksekusi. tidur , tonton , dan skrip python certain tertentu semua mengecewakan saya dalam hal ini.
Pada mikrokontroler seperti http://Arduino.cc saya akan melakukannya melalui interupsi jam perangkat keras.
Saya ingin tahu apakah ada solusi skrip shell waktu-tepat yang serupa. Semua solusi yang saya temukan di dalam StackExchange.com, menghasilkan jeda waktu yang nyata, jika berjalan selama berjam-jam. Lihat detailnya di bawah.
Tujuan/aplikasi praktis
Saya ingin menguji apakah koneksi jaringan saya terus berjalan dengan mengirimkan stempel waktu melalui nc
(netcat) setiap 1 detik.
Pengirim:
precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port
Penerima:
nc -l -p $port > netcat-receiver.txt
Setelah selesai, bandingkan kedua log:
diff netcat-sender.txt netcat-receiver.txt
Perbedaannya adalah stempel waktu yang tidak ditransmisikan.
Dari sini saya akan tahu jam berapa LAN / WAN / ISP saya bermasalah.
Solusi TIDUR
while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt
Mendapat offset tertentu dari waktu ke waktu, karena perintah dalam loop juga membutuhkan sedikit waktu.
Presisi
cat timelog-sleep.txt
2012-07-16 00:45:16
[...]
2012-07-16 10:20:36
Detik berlalu:34520
wc -l timelog-sleep.txt
Baris dalam file:34243
Ringkasan presisi:
- 34520-34243 =277 masalah waktu
- 34520/34243 =1,008 =diskon 0,8%
Solusi ULANGI PYTHON
Ditemukan di:Ulangi perintah Unix setiap x detik selamanya
repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt
Seharusnya menghindari offset waktu, tetapi gagal melakukannya.
Presisi
wc -l timelog-repeat-py.txt
2012-07-16 13:42:44
[...]
2012-07-16 16:45:24
Detik berlalu:10960
wc -l timelog-repeat-py.txt
Baris dalam file:10859
Ringkasan presisi:
- 10960-10859 =101 masalah waktu
- 10960/10859 =1,009 =diskon 0,9%
Solusi WATCH
watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"
Presisi
wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47
Detik berlalu:8499
wc -l timelog-watch.txt
Baris dalam file:8366
Ringkasan presisi:
- 8499-8366 =133 masalah waktu.
- 8499/8366 =1,016 =diskon 1,6%.
Jawaban yang Diterima:
Bagaimana cara kerja skrip Perl yang baru saja saya buat?
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw/time sleep/;
sub launch {
return if fork;
exec @_;
die "Couldn't exec";
}
$SIG{CHLD} = 'IGNORE';
my $interval = shift;
my $start = time();
while (1) {
launch(@ARGV);
$start += $interval;
sleep $start - time();
}
Gunakan:perl timer.pl 1 date '+%Y-%m-%d %H:%M:%S'
Ini telah berjalan 45 menit tanpa satu lompatan, dan saya menduga itu akan terus berlanjut kecuali a) beban sistem menjadi sangat tinggi sehingga fork() membutuhkan waktu lebih dari satu detik atau b) detik kabisat dimasukkan.
Namun, itu tidak dapat menjamin bahwa perintah berjalan pada interval detik yang tepat, karena ada beberapa overhead, tapi saya ragu itu jauh lebih buruk daripada solusi berbasis interupsi.
Terkait:Bagaimana cara mengetahui apakah saya melakukan booting menggunakan UEFI?
Saya menjalankannya selama sekitar satu jam dengan date +%N
(nanodetik, ekstensi GNU) dan menjalankan beberapa statistik di dalamnya. Lag paling banyak adalah 1 155 mikrodetik. Rata-rata (rata-rata aritmatika) 216 s, median 219 s, standar deviasi 42 s. Itu berjalan lebih cepat dari 270 s 95% dari waktu. Saya tidak berpikir Anda bisa mengalahkannya kecuali dengan program C.