質問
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プログラム以外では勝てないと思います。