ShellCommandActivity の Amazon Data Pipeline の一部として、いくつかの追加機能 (lftp など) をインストールして、Amazon Linux 64 ビットを実行している EC2 インスタンスで次のスクリプトを実行しようとしています。
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 サービスはログを書き出さないため、なぜ問題が発生するのかわかりません。同じイメージとインスタンス タイプでインスタンスを作成し、ボックスにログインして、自分でコマンドを実行します。
コードからすでに明らかなように、これらすべての目的は、S3 バケット内のファイルを sftp サーバーから削除することです。
ノート:
INPUT1_STAGING_DIR
は S3 バケットであり、その部分は Data Pipeline によって管理されており、この部分が機能していることは既に確認済みです- スクリプトは実際にはすべて 1 行で実行されます。実行しやすいように行は分割されていますが、展開すると、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