GNU/Linux >> Linux の 問題 >  >> Linux

時間の経過とともに時間差を累積することなく、非常に短い間隔で正確にUnixコマンドを実行しますか?

質問

UNIXコマンドを正確に実行できるようにしたい 毎秒長期間

コマンド自体の実行に時間がかかるため、一定時間遅れないソリューションが必要です。 スリープ見る 、および特定のpythonスクリプト この点ですべてが失敗しました。

http://Arduino.ccなどのマイクロコントローラーでは、ハードウェアクロック割り込みを介してこれを行います。
同様の時間精度のシェルスクリプトソリューションがあるかどうかを知りたいです。 StackExchange.com内で見つけたすべてのソリューションでは、何時間も実行すると、顕著なタイムラグが発生しました。以下の詳細を参照してください。

実用的な目的/アプリケーション

ncを介してタイムスタンプを送信することにより、ネットワーク接続が継続的に稼働しているかどうかをテストしたい (netcat)1秒ごと。

送信者:

precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port

受信者:

nc -l -p $port > netcat-receiver.txt

完了したら、2つのログを比較します。

diff netcat-sender.txt netcat-receiver.txt

差分は未送信のタイムスタンプになります。
これにより、LAN / WAN/ISPで問題が発生した時刻がわかります。

ソリューションスリープ

while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt

ループ内のコマンドにも少し時間がかかるため、時間の経過とともに特定のオフセットを取得します。

精度

cat timelog-sleep.txt

2012-07-16 00:45:16
[...]
2012-07-16 10:20:36

経過秒数:34520

wc -l timelog-sleep.txt

ファイル内の行:34243

要約された精度:

  • 34520-34243=277のタイミングの問題
  • 34520/34243 =1.008 =0.8%オフ

Solution REPEAT PYTHON

見つかった場所:Unixコマンドをx秒ごとに永久に繰り返す

repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt

時間オフセットを回避することを想定していますが、回避できません。

精度

wc -l timelog-repeat-py.txt

2012-07-16 13:42:44
[...]
2012-07-16 16:45:24

経過秒数:10960

wc -l timelog-repeat-py.txt

ファイル内の行:10859

要約された精度:

  • 10960-10859=101のタイミングの問題
  • 10960/10859 =1.009 =0.9%オフ

ソリューションウォッチ

watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"

精度

wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47

経過秒数:8499

wc -l timelog-watch.txt

ファイル内の行:8366

要約された精度:

  • 8499-8366=133のタイミングの問題。
  • 8499/8366 =1.016 =1.6%オフ。

承認された回答:

作成したばかりのこのPerlスクリプトはどのように機能しますか?

#!/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();
}

使用:perl timer.pl 1 date '+%Y-%m-%d %H:%M:%S'

1回のスキップなしで45分間実行されており、a)システムの負荷が高くなりすぎてfork()に1秒以上かかるか、b)うるう秒が挿入されない限り、実行が続くと思われます。

ただし、オーバーヘッドが発生するため、コマンドが正確に2番目の間隔で実行されることを保証することはできませんが、割り込みベースのソリューションよりもはるかに悪いとは思えません。

関連:UEFIを使用して起動しているかどうかを確認するにはどうすればよいですか?

date +%Nで約1時間実行しました (ナノ秒、GNU拡張)そしてそれについていくつかの統計を実行しました。最も遅れたのは1155マイクロ秒でした。平均(算術平均)216 µs、中央値219 µs、標準偏差42 µs。 95%の時間で270 µsよりも高速に実行されました。 Cプログラム以外では勝てないと思います。


Linux
  1. DSH –一度に複数のホストでLinuxコマンドを実行する

  2. Linux および Unix でファイルをコピーする方法10 cp コマンドの例

  3. UNIX の「time」コマンドは、ベンチマークに対して十分正確ですか?

  1. 時間コマンドでBashスクリプトの実行にかかる時間を確認する

  2. UNIX/LINUX でコマンドにかかる時間を追跡しますか?

  3. UNIXのtimeコマンドの出力をbashの変数にリダイレクトしますか?

  1. コマンド ラインの秘訣:Unix コマンドの実行日時を特定する方法

  2. 12 UNIX / Linux 時刻コマンド出力形式オプション例

  3. Unix では、最初にそのディレクトリに cd を実行せずにディレクトリで 'make' を実行できますか?