我正在尝试在运行 Amazon Linux 64 位的 EC2 实例上运行以下脚本,并安装了一些额外的东西(例如 lftp)作为 ShellCommandActivity 中 Amazon 数据管道的一部分。
INPUT_FILE_LIST=`/bin/ls -1 ${INPUT1_STAGING_DIR}` &&
SFTP_FILE_LIST=`/usr/bin/lftp -u username,password -e "set cmd:cls-default -1 && cls && bye" sftp://sftp.server.com` &&
while read name; do if `/bin/echo "$INPUT_FILE_LIST" | /bin/grep -q "^$name$"`; then OLD_FILES="$OLD_FILES $name"; fi; done < <(/bin/echo "$SFTP_FILE_LIST") &&
if [[ $OLD_FILES ]]; then /usr/bin/lftp -u username,password -e "rm ${OLD_FILES} && bye" sftp://sftp.server.com; fi
如果我删除带有它的行,while
它将运行到完成(ShellCommandActivity 达到 FINISHED 状态)但如果它在那里,则脚本“失败”,即 ShellCommandActivity 最终处于 WAITING_ON_DEPENDENCIES 状态。
不幸的是,在这种情况下,Data Pipeline 服务没有写出任何日志,所以我不确定我为什么会遇到问题,如果我创建一个具有相同图像和实例类型的实例并且我能够成功运行该命令通过登录到盒子自己运行命令。
从代码中可能已经很明显,所有这些的目标是从 sftp 服务器中删除 S3 存储桶中的文件。
笔记:
INPUT1_STAGING_DIR
是一个 S3 存储桶,该部分由数据管道管理,我已经确认这部分工作正常- 脚本实际上都是在一行上执行的;这些行被分解以使其更易于运行,但是在部署时,所有 4 行都连接在一起,每行之间只有一个空格,因此
&&
在每行的末尾和;
第 3 行中的所有行。
为方便起见,这是格式更好的代码:
INPUT_FILE_LIST=`/bin/ls -1 ${INPUT1_STAGING_DIR}` &&
SFTP_FILE_LIST=`/usr/bin/lftp -u username,password -e "set cmd:cls-default -1 && cls && bye" sftp://sftp.server.com` &&
while read name; do
if `/bin/echo "$INPUT_FILE_LIST" | /bin/grep -q "^$name$"`; then
OLD_FILES="$OLD_FILES $name";
fi;
done < <(/bin/echo "$SFTP_FILE_LIST") &&
if [[ $OLD_FILES ]]; then
/usr/bin/lftp -u username,password -e "rm ${OLD_FILES} && bye" sftp://sftp.server.com;
fi