4

背景 : こんにちは。現在、古い Linux SBC システムを使用しています。古くて機能が制限されていたBusyBox v1.00-rc2を使用しています。(いいえ、アップグレードはオプションではありません)。この SBC には複数のセンサーが接続されており、値とタイムスタンプが記録されています。

問題 : 数年後、RTC が実際の時間からずれ、一部の SBC が実際の時間から 1 時間以上 (遅く) 遅れます。

ntp サーバーで単純に ntpdate を実行することはできません。時間のジャンプが発生し、データ監視ログに大きなギャップが生じるためです。受け入れられません。

解決策: 次のような bash スクリプトを作成しました。

  1. SBC および ntp サーバーで ntp オフセットを確認します。
  2. 次に、オフセットを変数に記録します
  3. たとえば、オフセット値が 7 より大きい場合 (60 秒のオフセット)、スクリプトはdate -sコマンドを使用して、システム クロックを少しずつ増やします。
  4. 1時間ごとに最大60秒しか増加しません
  5. 例 :
    • SBC 時間は 2016 年 4 月 4 日 14:59:00 です
    • ntp サーバーからの実際の時間は 15:00:00 2016 年 4 月 4 日です。
    • ntpdate -q -4 utcnist2.colorado.eduを使用する と、 60 秒のオフセットで返されます
    • したがって、私のスクリプトは450 秒ごとに 7 秒しか増加しません
    • このロジックにより、SBC 時間は2016 年 4 月 4 日 16:04:17頃に ntp 時間に追いつきます。
    • 問題は、このスクリプトが時間を段階的にゆっくりと調整することですが、時々、それがうまくいかず、SBC 時間が実際の時間 ( Ntp時間) と比較して速くなり、これがデータ損失の原因となります (サーバーは失敗します)。 SBC 時間がサーバー時間より速い場合は受け入れます)。

質問:

  • これに似た増分時間ジャンプを行う他の方法はありますか?
  • ntpdate には時間の増分更新を行う -B 関数があることに気付きましたが、SBC ではこれを使用できませんでした。このスイッチを使用する正しい方法は何ですか? または、機能を誤解していましたか?
  • adjtimex はこの目的を達成できますか?
  • 必要な場合は、ここに私の完全な bash スクリプトを示します (ここに貼り付けるには長すぎます)。

http://pasted.co/65beb3db [パスワード: 123456]

4

1 に答える 1

0

この件に関しては結論に達しました。2つの解決策があります(私の経験から。多分もっと。自由に追加してください):

解決策 1

  • ソース: http://www.ep.ph.bham.ac.uk/general/support/adjtimex.html
  • 方法 : Linux のティック カウントと頻度を変更します。すべての計算は、bham.ac.uk (リンク内) のLSLowe によるJavaScript 内で確認できます。
  • 例 : システム クロックを 1 時間ごとに 60 秒速くしたい場合は、(tick = 10167)(frequency = -2184533)を変更し、 adjtimex -t 10167 -f -2184533を使用して適用する必要があります。

解決策2 (現在使用しているもの)

  • 上記の質問で、現在実行中のプロセスの pid を取得するためにps -anySwitchなどの最新の関数の多くを使用できない古いバージョンの busybox を使用していることを既に述べました。Pidof myscript.shコマンドも結果を生成しませんでした。
  • 上記の bash スクリプトでは、スクリプトが 15 分ごとに cron で開始されるたびに、スクリプトがファイル内に保存された pid をチェックするように、スクリプトの上に関数を作成します。pid がまだ実行中の場合、新しいスクリプトは終了します。これは、15 分ごとに複数のスクリプトが実行されるのを避けるためです。
  • この方法には何らかの欠陥があると思います。何らかの理由で、スクリプトが複数回実行され、時間の増分が速くなります (複数のスクリプトが実行されているため)。
  • そこで、この疑いを避けるために、スクリプトを 15 分ごとに実行する代わりに、cron を変更して別のスクリプトを実行し、スクリプトが実行されているかどうかを確認しました。
  • このメソッドを使用してスクリプトを起動している場合-> ./myScript 、 pidof myscriptを使用してpid番号を取得できることがわかりました
  • したがって、この方法を使用して灰色の領域を回避することは、非常に確実です。
  • 今まで、私はすでに私の問題を解決したようです。
  • ランチャー スクリプトの例:

!/ビン/sh

pid=pidof NTP_Update

if [ -n "$pid" ] ; then echo "NTP_Update is running..." else echo "NTP_Update not running..." cd /root/script ./NTP_Update fi


この回避方法が、古いビジーボックス バージョンで苦労していた人に役立つことを願っています。

于 2016-04-14T01:36:55.113 に答える