我试图在运行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状态。
不幸的是,数据管道服务在这种情况下没有写出任何日志,所以我不确定为什么我有问题,如果我创建一个具有相同映像和实例类型的实例并通过登录到盒子运行命令自己,我就能够成功地运行命令。
从代码中可能已经很明显了,所有这些的目标是从sftp服务器中删除S3 bucket中的文件。
指出:
-
INPUT1_STAGING_DIR
是一个S3桶,该部分由数据管道管理,我已经确认该部分正在工作 - 脚本实际上全部在一行上执行;这些行被分解以使其更容易运行,但是当部署时,所有4行都被连接起来,每个行之间只有一个空格,因此每行末尾的
&&
和第三行中的所有;
。
下面是为了方便,格式更好的代码:
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
我能够通过在脚本中使用s3cmd
而不是S3资源来解决这个问题。我不知道为什么这是有效的,但它确实做到了。我只是把第一行改成:
INPUT_FILE_LIST=`/usr/bin/s3cmd ls s3://my-bucket/my-prefix`
并将第三行中的grep
模式更改为$name$
,它开始工作。注意,这看起来很奇怪,因为如果我删除while循环,脚本就会像上面写的那样完成。
无论哪种方式,问题都"解决"了,尽管我很乐意将此解决方案替换为能够使用S3数据管道资源的解决方案。
这对我有用
input=$(aws s3 ls $1 | awk '{print $4}')
echo "$input"