我有一台远程服务器,可以全天连续接收文件。因为有这么多文件进入,所以远程服务器有一个cron作业,可以将新文件(大约每15分钟左右)移动到永久性的休息位置。这需要我经常登录以查找新文件,这也意味着我不能简单地镜像目录。我也不能使用rsync。我的想法是使用cron + bash + ncftp或lftp或类似的东西来创建当天的目录,登录,比较文件,开始下载新文件然后关闭连接,冲洗重复。
远程系统运行Windows,我正在使用Mac。我不控制远程服务器,我只是有ftp访问文件的目录(甚至不是他们的永久存储)。
我正在尝试配置一个cron作业(或更多):
1 - 检查sysdate并检查是否存在当前yyyy / mm / dd的本地文件夹。如果没有,那么它将被创建
2 - 登录到远程服务器并将所有新文件下载到正确日期的本地文件夹中(这应该只是在服务器接收数据和上次检查新文件之间的午夜时间关注)
我开始时:
#!/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进行测试时,当程序识别出重复文件时会提示我,此时我可能会选择“S!”这会跳过本地已存在的所有文件。所以我感觉到我根本不需要处理差异,也不需要列出两个目录的内容,从而消除了对NEW和OLD的需求,并为我简化了以下内容:
ncftpget *.filetype
编辑:为了获取目录中的文件,我不得不使用-R但因为我正在远程进入Windows框,-R不起作用,这是否意味着ncftp不可行?这需要lftp吗?
只要我能以某种方式使用S,这对我有用吗!默认情况下?这是否足够强大,或者创建包含目录内容列表的文件,并在它们之间进行比较是一个更健全的执行?我担心耗尽资源/带宽,但我也不想错过任何文件。最后一个问题是创建文件夹和记录错误,它似乎是ncftp和子程序都有标准日志和错误日志,如果这是正确的,那么我真的只需要担心将文件移动到文件夹当天的日期。
也许更合乎逻辑的工作流程是在每天结束时运行单独的cron作业,以处理当天下载的文件移动到与当天日期匹配的文件夹。因此,cron作业将有一个bash脚本检查LOCAL_DIR并读取每个文件的添加日期并移动到相应的文件夹,如果它不存在,它将mkdir等。
提前感谢任何见解/建议。
答案 0 :(得分:0)
我为此工作并设法使事情处于相当稳定的状态。我确实将这两个任务拆分为两个单独的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
这很好用,我在上面建立了检查并取得了巨大的成功。第二项任务是每天归档文件。这是相关的片段:
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