2

scp を使用してリモート Unix サーバーにファイルを転送しようとしています。そのサーバーには、処理対象の受信ファイルを検出するためにターゲット ディレクトリをポーリングするサービスがあります。コピーが完了する前に、ポーリング サービスが新しいファイルを取得しないようにしたいと考えています。それを行う方法はありますか?

私のファイル転送プロセスは、より大きな Java プログラムに埋め込まれた単純な scp コマンドです。理想的には、Jana の変更を伴わないソリューションが最適です (変更管理プロセスに関連する理由により)。

4

2 に答える 2

2

rsyncの代わりに使用してファイルをコピーすることをお勧めしますscprsyncはすでに新しいファイルを一時ファイル名にコピーしており、ファイル同期のための他の多くの便利な機能も備えています。

$ rsync -a source/path/ remotehost:/target/path/

もちろん、必要に応じてファイルごとにコピーすることもできます。

rsyncの一時ファイル名でポーリング サービスによる検出を回避できる場合は、コマンドを のラッパーとして機能するシェル スクリプトに置き換えるだけでscprsyncJava プログラムを変更する必要がなくなります。

Java プログラムがscpコマンドを呼び出すために使用する正確な形式を知っておく必要があります。これは、フィードしたオプションがrsync期待どおりに機能することを確認するためです。

また、Java プログラムがどのように を呼び出すかを理解する必要がありますscp。フルパス名 (つまり/usr/bin/scp) でこれを行う場合、このソリューションは、scp に依存するシステムに他のものを危険にさらす可能性があります (たとえば、scp がラッパーとしてではなく通常どおりに動作することを期待するなど)。のようにパッケージにインストールされたバイナリを変更すると、/usr/bin/scpパッケージの登録が「壊れる」可能性があり、バイナリがシェル スクリプトに変更されるため、将来のセキュリティ更新プログラムのインストールが困難になります。そしてもちろん、変更を加えるとセキュリティに影響する可能性があります。

全体として、Java プログラムを変更して、希望どおりに正確に実行できるようにした方がよいと思います。たとえそれが、シェル スクリプトを起動して自動化の側面を処理することであっても、後で変更する必要はありません。 Java を変更します。

幸運を!

于 2012-07-31T03:19:36.230 に答える
2
  • ファイルを別の (/tmp) ディレクトリに scp し、転送の完了後に ssh 経由でファイルを移動できます。別のディレクトリは、最終的な宛先ディレクトリと同じパーティションにある必要があります。そうしないと、コピー操作が行われ、同様の問題に直面することになります。宛先マシン上の別のサービスは、この移動操作を実行できます。

  • ファイルを隠しファイルとしてコピーし(ファイル名の前に を付けます.)、コピーしてから移動できます

  • ポーリング サービスを変更できる場合は、アクティブな scp プロセスを確認し、scp 引数に一致するファイルを無視できます。

  • 開いているファイルを確認lsof +d $directoryし、ポーリング サーバーでそれらを無視できます。

于 2012-07-30T15:59:48.850 に答える