
NTP を使用してマシンの時刻を更新しようとしています。しかし、エラーが発生します:
host # ntpdate ntp1.example.org
10 Aug 12:38:50 ntpdate[7696]: the NTP socket is in use, exiting
「ソケットは使用中です」というエラーはどういう意味ですか? このソケットを使用しているものを確認するにはどうすればよいですか?
これは CentOS 4.x システムで発生しますが、FreeBSD 7.x、Ubuntu 10.04、Solaris 10 でも発生します。
答え1
できるよ
lsof -n | grep -i "TCP\|UDP" | grep -v "ESTABLISHED\|CLOSE_WAIT"
すべてのリスニング ポートを確認するには、ntpd が実行されているかどうかを確認します。
service ntpd status
「ソケットが使用中」とはどういう意味でしょうか? 多少の難点を補うのが許されるなら (ごく基本的な説明なので、ほとんどがあなたにとっては補修的なものであることをお詫びします)...TCP/IP (インターネットの言語) では、各コンピュータに IP アドレスがあり、インターネット上でそのコンピュータを一意に識別することを規定しています。さらに、各 IP アドレスには、接続可能な 65,000 個の番号付きポートがあります。
Web サーバーに接続する場合、ブラウザでサイトを開きますが、実際には、その下にある機械によって Web サーバーの IP のポート 80 に接続されます。Web サーバーのデーモン (ポート 80 への接続を待機するプログラム) は、「ソケット」を使用してそのポートを開いたままにして、そのポートを自分自身のために予約します。一度に同じポートを使用できるのは 1 つのプログラムだけです。
ntpd が実行中だったので、そのポートが使用されていました。「ntpdate」はそのポートにアクセスしようとしましたが、すでに開かれていたため、「ソケットは既に使用中です」というエラーが発生しました。
編集
UDPも考慮するように変更
答え2
開いているソケットを探すのにnetstatを使うこともできます。他の投稿者が提案しているlsofを使うよりずっときれいです。rootとしてこのコマンド ラインを試してください。
netstat -lp -u -t
関連する PID とプログラムを含む、すべてのリスニング接続を表示します。-l パラメータはリスニング接続を指定するもので、-p は PID/名前を表示することを指定します。-t と -u は、netstat に TCP と UDP 接続 (IPv4 と IPv6) のみを表示することを指示します。
数値のポートとホスト名を表示する場合 (つまり、ホストの場合は解決されず、ポートの場合はサービス名に変換されない)、-n
上記のコマンド ラインに追加できます。
編集:これは Linux では動作しますが、BSD ベースのボックスを持っていないので、BSD でどの程度動作するかはわかりません。
答え3
FreeBSD では、lsof が機能しない場合 (たとえば、何らかの理由で /dev/mem を持たない仮想化システムの場合) に sockstat を使用することもできます。IPv4 ソケットをリッスンしているすべてのプログラムのリストを取得するには、次のようにします。
sockstat -l4
答え4
どのアプリケーションがこのソケットを使用しているかを調べるために使用できますlsof
。