1

我正在尝试在运行 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
4

2 回答 2

0

s3cmd我能够通过在我的脚本中使用而不是 S3 资源来解决这个问题。我不知道为什么这有效,但确实有效。我只是将第一行更改为:

INPUT_FILE_LIST=`/usr/bin/s3cmd ls s3://my-bucket/my-prefix`

grep并将第三行中的模式更改为$name$并开始工作。请注意,这似乎很奇怪,因为如果我删除了 while 循环,脚本会按照上面的说明完成。

无论哪种方式,问题都“解决了”,尽管我很乐意将此解决方案替换为能够使用 S3 数据管道资源的解决方案。

于 2013-06-10T13:34:46.780 回答
0

这对我有用

input=$(aws s3 ls $1 | awk '{print  $4}')
echo "$input"
于 2015-06-23T01:51:16.043 回答