GNU/Linux >> Belajar Linux >  >> Linux

Jalankan Perintah Unix Tepat Pada Interval yang Sangat Singkat Tanpa Mengumpulkan Jeda Waktu Seiring Waktu?

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.


Linux
  1. Jalankan Perintah Tanpa Membuat Saya Menunggu?

  2. Bagaimana Cara Menjalankan Perintah Tanpa Properti Root?

  3. Trik Baris Perintah:Cara Mengidentifikasi Tanggal dan Waktu Eksekusi Perintah Unix

  1. 12 Contoh Opsi Format Output Perintah Waktu UNIX / Linux

  2. Bagaimana cara menjalankan skrip sebagai pengguna lain tanpa kata sandi?

  3. Lacak waktu yang dibutuhkan perintah di UNIX/LINUX?

  1. DSH – Jalankan Perintah Linux Pada Banyak Host Sekaligus

  2. Bagaimana Cara Menyalin File di Linux dan Unix? Contoh Perintah 10 cp

  3. Jalankan perintah di bash tanpa menyimpan di riwayat