3

一連のファイルがディレクトリにダウンロードされ、逆多重化され、個々のマシンにコピーされるファイル転送システムがあります。ファイルは、マスター サーバーによって受信されると転送されます。また、ファイルは通常バーストで到着します。(sshキーによる認証)

このスクリプトは sftp セッションを作成し、パイプを使用して fifo パイプの先頭を監視します。

HOST=$1
pipe=/tmp/pipes/${HOST%%.*}
ps aux | grep -v grep | grep  sftp | grep "user@$HOST" > /dev/null
if [[ $? == 0 ]]; then
    echo "FTP is Running on this Server"
    exit
else
    pid=`ps aux | grep -v grep | grep  tail  | tr -s ' ' | grep $pipe`
    [[ $? == 0 ]] && kill -KILL `echo $pid | cut -f2 -d' '`
fi
if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi
tail -n +1 -f $pipe | sftp -o 'ServerAliveInterval 60' user@$HOST > /dev/null &
echo cd /tmp/data >>$pipe #Sends Command to Host
echo "Started FTP to $HOST"

更新: "ps aux" を使用してクリーンアップ コードを変更し、ftp セッションが実行されているかどうかを確認し、その後、tail -f がまだ実行されているかどうかを確認しました。それぞれ user@host とパイプの名前で grep します。これはスクリプトが呼び出されたときに行われ、ファイルをアップロードしようとするたびにスクリプトが呼び出されます。
いいえ:

FILENAME=`basename $1`
function transfer {
    echo cd /apps/data >> $2 # For Safety
    echo put $1 .$FILENAME >> $2
    echo rename .$FILENAME $FILENAME  >> $2
    echo chmod 0666 $FILENAME  >> $2
}
./ftp.sh host
[ -p  $pipedir/host ] && transfer $1 $pipedir/host

マスター サーバーで受信されたファイルは、sftp によって送信されるように、put コマンドと利用可能なファイルの場所を fifo パイプに書き込む Incron によってキャッチされます (名前の変更も実行されます)。

私の質問は、これは安全ですか? これは、ftp エラー/イベントでクラッシュする可能性があります。ログインエラーの心配はありません。
目標は、ftp ログインの数を減らすことです。1 セッション/分 (またはそれ以上) の間隔。
また、ファイルを受信したときに転送できるようにします。動的コマンド。可能であれば、標準の ubuntu ライブラリを使用したいと思います。

編集:いくつかの問題をテストして作業した後、サーバーは単に実行されます

[[ -p $pipe ]] && echo FTP is Running on this Server
ln -s $pipe $lock &> /dev/null || (echo FTP is Running on this Server && exit)
[[ ! -p $pipe ]] && mkfifo $pipe
( tail -n +1 -F $pipe & echo $! > $pipe.pid ) | tee >
        ( sed "/tail:/ q" >/dev/null && kill $(cat $pipe.pid) |& rm -f $pipe >/dev/null; )
        | sftp -i ~/.ssh/$HOST.rsa -oServerAliveInterval=60 user@$HOST &
rm -f $lock

かなりシンプルですが、うまく機能します。

4

1 に答える 1

1

より単純な(そして堅牢な)同期インフラストラクチャのセットアップに興味があるかもしれません:ファイルが到着したときに特定のホストが接続されていない場合...ファイルを受信することはありません(コードを正しく理解している場合)

私は次のようなことをします

 rsync -a -e ssh user@host:/apps/data pathToLocalDataStore

クライアント マシン上で、定期的またはイベントごとに...rsync はタイムスタンプとサイズ (-a には -t が含まれる) によってファイルをインテリジェントに同期します。

イベントは、次のようなプロセスの終了になります: クライアントは (ホストの ~/.ssh/config で秘密鍵の使用を構成します):

#!/bin/bash
while :;do
  ssh user@host /srv/bin/sleepListener 600
  rsync -a -e ssh user@host:/apps/data pathToLocalDataStore
done

サーバー上 は、 新しいファイルを受信した後のサーバー/srv/bin/sleepListenerへのシンボリックリンクです。/bin/sleep

killall sleepListener

注: 10 分ごとに完全なチェックが実行されます...ノードがオフライン/オンラインになっても問題ありません...

于 2013-07-19T18:10:42.563 に答える