2016-05-02 23 views
1

ファイルを1日中連続して受信するリモートサーバーがあります。非常に多くのファイルが入ってくるので、リモートサーバーには、新しいファイルを(約15分ごとに)永続的な休憩場所に移動するcronジョブがあります。このため、新しいファイルを探すために私から頻繁にログインする必要があります。また、単にディレクトリをミラーリングすることはできません。私はrsyncを使うこともできません。次に、cron + bash + ncftpまたはlftpなどを使用して、その日のディレクトリを作成し、ログインし、ファイルを比較し、新しいファイルをダウンロードしてから接続を閉じ、リンスを繰り返すことです。新しいリモートファイルをダウンロードして新しいフォルダに保存するncftpのBashスクリプト

リモートシステムはWindowsを実行していますが、Macを使用しています。私はリモートサーバーを制御していない、私は単にファイルのディレクトリへのftpアクセスを持っています(そしてそれらの永久ストアもありません)。 SYSDATEをチェックして、現在のYYYY/MM/DDとのローカルフォルダが存在するかどうかを確認 -

1:

は私がしますcronジョブ(またはそれ以上)を設定しようとしています。そうでない場合は、作成されます

2 - リモートサーバーにログインし、適切な日付のローカルフォルダにすべての新しいファイルをダウンロードします(これは、サーバーがデータを受信して​​から最後にI 「に!S」を

#!/bin/bash 

PROGNAME=$(basename $0) 

#Here are some local variables: 

NEW='/localdir/newfiles' 
OLD='/localdir/oldfiles' 
LOCAL_DIR='/localdir' 

# Here are the remote server variables 

HOST='some.server' 
USER='user' 
PASSWD='passwd' 
REMOTE_DIR='/remotedir' 
#Let's check for new files: 

ncftpls -1 HOST > NEW #this lists files and creates a record we can use to compare with 

diff OLD > NEW 
???? 

しかし、ncftpgetをテストするとき、私はプログラムは、私が選択することができ、その時点で重複ファイルを識別したときにプロンプ​​トが表示されています:私は始まった

新しいファイル)をチェックすでにローカルに存在するすべてのファイルをスキップします。

ncftpget *.filetype 

EDIT:だから私は、このようにNEWとOLDの必要性を排除し、のようなものを私のためにこれを簡素化し、私はすべての差分に対処する必要がないことを感知したり、両方のディレクトリの内容を一覧表示していますでディレクトリ内のファイルを取得するためには、-Rを使用する必要がありましたが、Windowsのボックスにリモート処理しているため、-Rは機能しません。このncftpは実行可能ではありませんか?それはlftpを必要としますか?

私は何とかSを使うことができる限り、これは私にとってはうまくいくはずですか!デフォルトでは?これは十分に堅牢であるか、ディレクトリコンテンツのリストを保持しているファイルを作成し、それらのファイルを比較することがより健全な実行になるでしょうか?私はリソース/帯域幅を使い切ることを心配していますが、いずれのファイルも見逃したくありません。最後の問題は、フォルダとロギングエラーを作成することで、ncftpと思われ、サブプログラムに標準ログとエラーログの両方がある場合は、実際にはファイルをフォルダに移動することについて心配する必要があります。当日の日付。

もっと論理的なワークフローは、毎日の終わりに別のcronジョブを実行して、その日にダウンロードしたファイルをその日の日付に一致するフォルダに移動することです。そのため、cronジョブでLOCAL_DIRをチェックし、各ファイルの日付を読み込み、存在しなければ適切なフォルダに移動するbashスクリプトを作成します。

事前の感謝とアドバイスありがとうございます。

答えて

0

私はこれに取り組み、かなり安定した状況で物事を得ることができました。私は2つのタスクを2つの別々のbashスクリプトに分割しました。

ncftpget -R -T -f "$FTP" -d "$NCFTP_LOG" "$REMOTEDIR" "*.xml" 
EXIT_V="$?" 
    case $EXIT_V in 
     0) O="Success.";; 
     1) O="Could not connect to remote host.";; 
     2) O="Could not connect to remote host - timed out.";; 
     3) O="Transfer failed.";; 
     4) O="Transfer failed - timed out.";; 
     5) O="Directory change failed.";; 
     6) O="Directory change failed - timed out.";; 
     7) O="Malformed URL.";; 
     8) O="Usage error.";; 
     9) O="Error in login configuration file.";; 
     10) O="Library initialization failed.";; 
     11) O="Session initialization failed.";; 
    esac 

if [ "$EXIT_V" = 0 ]; 
    then 
     echo ""$O"! New files have been retrieved!" 
    else 
     echo "There has been an error: "$O"" 
fi 

これはうまく動作し、上記のことを大成功で確認しました。 2番目のタスクは、毎日ファイルをアーカイブすることでした。関連するスニペットは次のとおりです。

FILE=($(find $REMOTEDIR -maxdepth 1 -iname "*.xxx")) 

if [ "${#FILE[@]}" -gt 0 ]; then 
    rsync -aq --include='*.xxx' $REMOTEDIR/ $LOCALDIR 
     if [ "$?" -eq "0" ] 
     then 
      find $REMOTEDIR -maxdepth 1 -iname "*.xxx" -print0 | xargs -0 rm 
      echo "All of today's files have been moved to the archive." 
     else 
      echo "There was an error while running rsync." 
    fi 
else 
    echo "There are no files to be moved. This may indicate a problem." 
    echo "Check the tracelog." 
    exit 1 
fi 
関連する問題