1

裏話:

Ruby 1.8.6 で書かれた古いスクリプトで、ftp への接続を開き、構成ファイルをダウンロードします。Windows ftp サーバーを使用する特定のクライアントでは、スクリプトがハングします。ログは、ftp への接続を開いた後、書き込みを停止します。これは古いスクリプトで、Ruby で書かれており、私はその専門家ではありません。

私が試したこと:

そこで、このタイムアウトの実装を試して、ftp接続がこのコードでハングアウトするかどうかを確認しました

Timeout::timeout(5) {
ftp = Net::FTP.new(host,pass,host)
}

問題は、これが機能していないことです。私の推測では、インタープリターは接続を開くときに停止し、インタープリターがスタックしているため、タイムアウトによって接続が切断されません。

それが問題である可能性はありますか?

おそらく別の解決策があるかどうか、または私が何か間違っているかどうか教えていただけますか?

それについての詳細情報:

この問題は、月に一度のように発生します。せいぜい2回みたいな。クライアントから ftp サーバーのログが送られてきましたが、問題はないようです。まったく理由もなくFTPがそこでハングアップするだけです...

4

1 に答える 1

3

無期限にハングアップするかどうかはわかりません。そうでない場合、最善の方法は、最終的にタイムアウトになったときにエラーコードを取得してキャプチャすることです。これにより、分析のための情報がもう少し得られます。

以下に考えられる回避策をいくつか示します。

を使用したタイムアウトProcess.fork

ただし、当面は別のプロセスで FTP タスクを実行し、そのプロセスでタイムアウトを使用するように切り替えることができます。これにより、Ruby グローバル インタープリター ロックがタイムアウト イベントの可能性を無効にするのを防ぐことができます。

このようなもの:

child = Process.fork do
  # Run the whole FTP task in here...
  ftp = Net::FTP.new(...)
  ...
end

# Timeout handling is done in the parent process
begin
  Timeout::timeout(...) do
    Process.wait(child)
  end 
rescue Timeout::Error
  # Terminate child in case of timeout
  Process.kill("KILL", child)
end

を使用したタイムアウトSystemTimer

ruby 1.8.6 を実行しているため、Ruby 1.8実装の制限を回避しようとするSystemTimerを調べるという別のオプションがあります。Timeout

于 2012-06-12T12:54:18.597 に答える