一連のファイルがディレクトリにダウンロードされ、逆多重化され、個々のマシンにコピーされるファイル転送システムがあります。ファイルは、マスター サーバーによって受信されると転送されます。また、ファイルは通常バーストで到着します。(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
かなりシンプルですが、うまく機能します。