リモートLinuxマシンでのC ++のコンパイル-「クロックスキューが検出されました」という警告


168

私はPuTTYとWinSCPを介して大学の小さなLinuxクラスターに接続し、後者を使用してファイルを転送し、前者でコンパイルして実行しています。これまでのところ、私の研究は大学の研究室で行われましたが、今日、興味深い警告を生成するいくつかの作業を自宅で行っています。

もののフォルダー全体をアップロードし、makeコマンドを実行すると、これが出力の最終行として表示されます。

make:警告:クロックスキューが検出されました。ビルドが不完全な可能性があります。

結果のバイナリは正しく機能し、ビルドプロセスで他の予期しないエラーは発生していないようです。

新しい/置換ファイルをアップロードした後にビルドすることでエラーをトリガーできるようです(ローカルですべてを編集してから、新しいバージョンをアップロードします)。ファイルの変更時間が一致しないのと同じくらい簡単なことなのでしょうか。またはもっと心配ですか?

だから、私は心配する必要がありますか?これをどのように修正/防止できますか?


いくつかの回答で述べたように、時計の違いが考えられます。コピー前後のソースファイルの変更時間を比較することもできます。夏時間の扱いが異なる2つのOS /ファイルシステムが原因で、変更時間が1時間異なる場合があります。
スティーブジェソップ2010

最後の1つの提案:私はWindowsマシンを持っていないので、PuTTYとWinSCPの機能に精通していませんが、多くの場合、ファイル転送ツールには、変更された時刻を保持するかどうかを制御できるオプションがあります。mod時間は明らかに保持されますが、オフにできる場合は、ファイルがシステムにコピーされるときに、リモートシステムクロックではなく、システムクロックによって設定されたmod時間を使用します。
MadScientist 2012

回答:


206

このメッセージは通常、一部のファイルの変更時刻が現在のシステム時刻より遅いことを示しています。はmake、ソースファイルがオブジェクトファイルよりも最近変更されたかどうかをチェックすることにより、インクリメンタルビルドを実行するときにコンパイルするファイルを決定するため、この状況では不要なファイルがビルドされたり、さらに悪いことに、必要なファイルがビルドされない可能性があります。

ただし、ゼロからビルドしている場合(インクリメンタルビルドを実行していない場合)は、この警告を無視しても問題はありません。


4
クラスターの時間はデスクトップから約3分遅れているようです。そのため、「将来」で変更されたファイルが原因である可能性があります。何かをアップロードした後、ビルドを実行する前に5分ほど待つのが最も安全な賭けですか?私は待つ必要がないので、アップロードされた「将来の」ファイルの時間をリセットして問題を回避する方法はありますか?
DMA57361

14
@ DMA57361:touch *mtimesを現在の時刻に更新します。また、あなたはあなたの時計(?それは間違っている、としませユニのマシン...後者の場合、多分それを修正するためにシステム管理者に依頼し、デスクトップだと仮定して)同期さために、デスクトップ上のNTPを有効にすることができます
CAF

2
それをありがとう、touch *それは今のところです、そして私がどちらが間違っているかを見つけて、おそらく私が次回サイトにいるときに管理者に連絡することができるかどうかを確認します。
DMA57361

1
私の場合、再帰的なタッチが必要でした:find . -exec touch {} \;
ams

8
このようなコマンドの@AaronS touchは、複数のファイルを受け入れて処理することができます。これにより、可能な限り多くの引数を指定してfind . -exec touch {} +呼び出すことtouchにより、(はるかに)より効率的に実行できます。
Viktor Dahl

56

通常、これはNFSマウントされたディレクトリを構築しているときに発生し、クライアントとNFSサーバーのクロックが同期していません。

解決策は、NFSサーバーとすべてのクライアントの両方でNTPクライアントを実行することです。


1
NFSマウントされたディレクトリにビルドしていません。
kingsmasher1 2009

そのような警告を抑制するためのいくつかのヒントを与えることができるかどうか、私に知らせてください。それは実際には実行または結果に何の違いも生じないからです。
kingsmasher1 '09 / 09/28

@ kingsmasher1:関係するすべてのマシンでNTPクライアントを実行します。
janneb 2011

ターゲットを確認しました。日付は設定されていません。ここでNTPを実行する方法がわかりません。日付を更新しても大丈夫ですか?ビルドするx86は現在の日付に設定されていますが、ターゲット(実行する場所)の日付は1970年代のものです。
kingsmasher1 2011

1
問題は分類されます。目標日を現在の日付に変更すると、警告は消えました。したがって、問題は次のとおりです。目標日が実行日より前の日付である場合、問題が発生します。
kingsmasher1 2011

22

ネットワークタイムプロトコルをインストールする

これmakeは、サーバー上のSamba SMB CIFS共有で実行しているときにも起こりました。永続的なソリューションはntp、サーバーとクライアントの両方にデーモンをインストールすることです。(この問題はを実行しても解決されないことに注意してくださいntpdate。これにより、時差が一時的に解決されるだけで、将来は解決されません。)

UbuntuおよびDebian派生システムの場合、コマンドラインで次の行を入力するだけです。

$ sudo apt install ntp

さらに、touch *影響を受けるディレクトリでコマンドを1回(そして1回だけ)実行して、ファイルの変更回数を1度に修正する必要があります。

$ touch *

ntpとの違いの詳細についてはntpdate、以下を参照してください。



6

LinuxQuestions.orgのユーザーm9dhatterによると:

「make」は、ファイルのタイムスタンプを使用して、コンパイルしようとしているファイルが古いか新しいかを判断します。時計が壊れていると、コンパイルに問題が発生する可能性があります。

別のマシンで数分進んだ時間にファイルを変更し、それらをマシンに転送してコンパイルしようとすると、ファイルが将来から変更されたという警告が出る場合があります。時計がゆがんでいるか、その影響で何かが発生している可能性があります(本当に思い出せません)。あなたはちょうど問題のあるファイルにlsしてこれを行うことができます:

#touch <問題のファイルのファイル名>


6

ここでの他の答えは問題をうまく説明するので、ここでは繰り返しません。しかしmake clean、まだリストされていないそれを解決できる1つの解決策があります。単に実行してから、再実行してくださいmake

makeがすでにコンパイルされたファイルを削除すると、makeがタイムスタンプを比較するファイルを作成できなくなり、警告が解決されます。


これは本当の解決策ではありません:コンパイラがすべてをコンパイルするのに30分必要で、単一のファイル(ビルドに2秒しか必要ない場合)で作業している場合、巨大な図書館。正しい?しかし、はい、make cleanあなたと一緒に(他のものを作成することによって)問題を解決します。
Leos313

@ Leos313私は私のために働いたものを共有しています。root権限がないためにNTPをセットアップできずtouch、すべてのファイルで使用するだけのコンパイル結果を信用できなかった学校のネットワークでこの問題に遭遇しました。完全な再コンパイルが必要になるのは正しいですが、それが時間の価値があるかどうかは、優先順位とプロジェクトのサイズによって異なります。それが最善ではない、またはいくつかの欠点があるという理由だけで、「実際の解決策ではない」と言うのは正確ではないと私は思います。それは問題を修正します。私に対する解決策のように聞こえます。
skrrgwasme

私は反対票を投じなかった:)それは他を作成することによって問題を解決します。これ以上のものはありません!:)確かに答えはほとんどの状況で役立ち、ここにいる価値があります!私が強調したいこと、そして時々、実行するより警告に留まる方が良いmake clean
Leos313

4

私は過去にこれを経験しました-機械に時計が出ていないためです。すべてのマシンが同じ時刻になるようにNTPを設定することを検討してください。


2

これは通常、ホストマシンとクライアントマシン間の時間の不一致が原因です。ntpを使用して、マシンの時刻を同期することができます


1

解決策は、NTPクライアントを実行することです。以下のようにコマンドを実行するだけです。

#ntpdate 172.16.12.100

172.16.12.100はntpサーバーです


2
Stack Overflowへようこそ!投稿ありがとうございます!投稿では署名/キャッチフレーズを使用しないでください。あなたのボックスはあなたの署名として数えられます、そしてあなたはあなたが好きなあなた自身についてのどんな情報でも投稿するためにあなたのプロフィールを使うことができます。署名/キャッチフレーズに関するFAQ
Andrew Barber

使用ntpdateは1回限りの修正です。ntp永続的なソリューションを取得するには、サーバーとクライアントの両方にインストールすることをお勧めします。
Serge Stroobandt 2014年

1

コンピュータの時計の電池を交換してください。このエラーメッセージは、マザーボードのコイン探しバッテリーを交換する必要があったときに見ました。


1

(誰かがここに到着した場合に備えて)sudo権限がある場合、1つのオプションはシステム時刻を同期することです

sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"

-1

somefile.oなどのコンパイル結果がsomefile.cなどのソースより古いかどうかを確認します。上記の警告は、ファイルのタイムスタンプに関する何かがおかしいことを意味します。おそらく、Universityサーバーのシステムクロックはあなたのクロックとは異なり、たとえば午後1時に変更日の午後2時のファイルをプッシュします。日付を入力すると、コンソールで時刻を確認できます。


-3

これは私に起こりました。それは私が走ったためにmake -j 4、いくつかの仕事が順不同で終わったからです。-jオプションを使用する場合、この警告が予想されます。


5
ジョブは順不同で終了します。修正時刻が未来であることを意味しません。
klimkin

@klimkinどうして?一部のプロセッサーは、他のプロセッサーが開始する前にコンポーネントの作成を完了したと思います。
キロジュール2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.