【问题标题】:Data Pipeline script with while loop stuck in WAITING_FOR_DEPENDENCIES state带有 while 循环的数据管道脚本卡在 WAITING_FOR_DEPENDENCIES 状态
【发布时间】:2015-06-23 09:51:16
【问题描述】:

我正在尝试在运行 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 行都连接在一起,每行之间只有一个空格,因此每行末尾的 &amp;&amp; 和第三行中的所有 ;。李>

为方便起见,这里是格式更好的代码:

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

【问题讨论】:

    标签: bash amazon-s3 amazon-ec2 lftp amazon-data-pipeline


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这对我有用

      input=$(aws s3 ls $1 | awk '{print  $4}')
      echo "$input"
      

      【讨论】:

        猜你喜欢
        • 2014-08-06
        • 2011-08-26
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 2021-07-01
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多