ラック
Home > ブログ > 記事 > 2014年12月 > ディレクトリ下の最新ファイルだけftp・2

ディレクトリ下の最新ファイルだけftp・2

カテゴリ: Linux

以前「あるディレクトリにバックアップファイルがたまっているような状態で、そのうち最新のファイルだけを定期的にftpで別のデバイスに転送したい」ということでシェルスクリプトを書いたのですが、それがちゃんと動いていないことが判明。 ※参照:該当記事

エラーとしては、

local: y: No such file or directory
Local directory now /<バックアップファイルが溜まっているフォルダのパス>/
(local-file) (remote-file)

という内容がエラーメールとして管理者宛に届いている状態。
…ローカルディレクトリはきちんと移動できていることから、ファイル名が見付からないことが原因っぽい。色々実験した結果、ファイル名がきちんと指定されているが、そのファイルが見つからない場合は

local: hogehoge.tar.gz y: No such file or directory

みたいな感じ(うろ覚え)で1行目にきちんと指定したファイル名がエラーに入ったので、最初のエラーの場合、ファイル名が空文字列になっているようです。

…ということは、シェルの変数に格納したはずのファイル名がftpへ渡っていないということか?
ということで色々調べたがよく分からず。また色々実験しているうちに、あることに気付きました。

「手動でシェルを実行すると成功するが、cronで実行させると失敗する」
…ということは、シェルスクリプトの記述間違いではないようです。

その関連に原因を絞って調べてみると、

他にも同じような題材を扱っているサイトがあったのですが、スクリプトの内容が一番シンプルだったのがここだったのでこちらを参考に。
cronの実行ユーザはrootにしているので、実行権限とかは問題ないはず。しかし、cronで実行した場合はユーザ実行時とは環境変数が異なる状態で実行される、らしいです。

…シェル上の変数に格納したはずのファイル名が引き渡せていないのは、rootとcronで環境変数が異なるがために、cronからだとrootのシェル上の変数が読み込めていないのでは?
ということで実験。

#!/bin/sh
#
# LatestFile transport.
#

USERINFO=~/.bashrc
source ${USERINFO}

cd /hogeDirectory
LATEST_FILE="`ls -lt backup_* | head -n 1 | gawk '{print $9}'`"
/bin/ftp -n << END

open XXX.XXX.XXX.XXX
user username password
binary
cd /fugaDerectory
lcd /hogeDirectory
put $LATEST_FILE
y
bye
END

前回のスクリプトの冒頭に、環境変数を引き渡す処理2行を追加。
これでcronを実行…したら、動きました!
ちゃんとバックアップ先にファイルがアップされました。

ということで、これでこの件は解決。…ようやくきちんとバックアップが取れる…!

タグ: サーバ環境・構築, シェル, トラブル対処

 



関連する記事一覧