プロが教えるわが家の防犯対策術!

Linux側クライアント、PC側サーバの役割でクライアント側からファイルをFTPによりダウンロードします。
64KBのファイルを400msecに一回の繰り返しで数十回受信するとFTPのところでHangUpしてしまいます。
この障害は数回目で発生することもあれば20回無事通り抜けることもあります。

 障害の原因がクライアント側なのかサーバ側なのか特定できていません。

 クライアント側LinuxのプログラムではFTP受信は専用スレッドを設け、メインと分離していますが、受信スレッドに十分なリソースが配分されないことが原因かなとも思っています。

 Windows側はFTP6サーバをコンパネ>『プログラムと機能』で組み込んでいます。

FTPクライアント側:
 Linux2.6.18-at9 Debian PowerPC 内部クロック300MHz

 メインスレッド側からメッセージキューにより開始信号を受け
 system("msh fileRcv.sh file");
により、Winodws側にファイル送信を要求します。

fileRcv.shの内容は:

#!/bin/sh
HOST_NAME="192.168.1.3"
USER="ftp"
PASSWORD=NULL

ftp -n ${HOST_NAME} >&2 >ftpLog.txt << _EOF_
user ${USER} ${PASSWORD}
bin
get ${FILE_NAME}
bye
_EOF_
exit

です。

 解決には何よりもエラーLOGを取得することが先決ですが
ftp -n ${HOST_NAME} >&2 >ftpLog.txt << _EOF_
の記述に問題があるのか、うまくエラーLOGを取得できません。
何とか得られた結果は以下の通りでした:

receive aborted
waiting for remote to finish abort

 この内容では解決にはなりません。


 なにか解決のヒントがあればお願いいたします。

A 回答 (4件)

>これは可能でしたのでテストしてみました。


>結果は
>?Invalid commandが各アクセスについて2行増加してしまいました。

私の意図が通じてないですが、もしかして、組み込み用Linuxとかで、サーバー機やデスクトップ機のようなシェルプロンプト(Terminal)が存在しないと言うことでしょうか?

ということだと、おそらくスクリプトの書き方の問題ではないですね。

>障害の原因がクライアント側なのかサーバ側なのか特定できていません。

普通のLinux機をクライアントにして同じ事をやってみれば切り分けられます。

あるいは、Windows側に、WiresharkなどのTCP/IP通信のログを取れるツールを入れて、通信内容を調べるとか。

この回答への補足

notnot様

 申し上げていませんでしたが、組み込み用Linuxです。シェルプロンプトはありません。
bashもなかったのでユーザランドからmsh(Mini Shell ?)というのを見つけて組み込みました。

Winodew Vista FTPサーバ側が問題である可能性は少ないのではないかと考えています。サーバ側には該当ファイルがあればOpenして書換え途中でもFTP受信はできるようです。この場合は障害という現象にはならず内容が定まらないだけです。

普通のLinux機は手元にないのですが、PC側のVMwarePlayer上でFullのLinuxが動いているのでここからdownload要求を出す手もあるかもしれません。

このシステム特有の問題とも考えられるのでベンダーにサポートを求めています。そのアンサーをまっていたので返信が遅れてしまいました。

進展がありましたら報告いたします。ありがとうございました。

補足日時:2011/05/23 23:02
    • good
    • 0

ncftpget 使ってみればいかがでしょうか。



http://digit.que.ne.jp/visit/index.cgi?LinuxZaur …

上記ページに『dオプションはなぜファイル転送が失敗しているかを確認したい場合には大変有用なオプションです。このオプションにより、指定する作業に対するFTPセッション全体の内容を出力してくれますので、あなたの考え違いを示唆してくれるでしょう。もしあなたが特にデバッグ情報のアウトプット先ファイルを指定しなかった場合、デバッグ情報は標準出力に出力され、画面に表示されます。』とあります。

※ ncftpは多くのLinuxでパッケージとして簡単に導入可能かと思います。
    • good
    • 0
この回答へのお礼

saijyo_739様

Resありがとうございます。

さっそくテストにかかったのですが、ncftpはライブラリ中にありませんでした。

このシステムを提供したVendorに問い合わせてみます。

ありがとうございました。

お礼日時:2011/05/22 21:42

>それとも_EOF_で囲まれたftp接続後のcommandに問題があると考えるべきなのでしょうか?。



そうですね。

>user=ftp, password=NULL, つまりanonymousであること

このあたりでしょう。
手でコマンドを打って、

ftp -n 192.168.1.3
user ftp NULL

でログイン出来ますか?anonymosユーザに対しては、パスワードにメールアドレス形式を要求する設定もありますけど、そのあたりとか。

あと、Linuxでスクリプト中からftpでファイルを取得するのであれば、ftpコマンドでなくwgetコマンドを使うのが普通だとおもうので、インストール可能ならそちらを使ってみるとか。
wget ftp://192.168.1.3/file
    • good
    • 0
この回答へのお礼

notnot様

Resありがとうございます。

ftp -n 192.168.1.3
user ftp NULL

これは可能でしたのでテストしてみました。
結果は
?Invalid commandが各アクセスについて2行増加してしまいました。

理由はわかりません。

system("msh fileRcv.sh file");
のPermissionに問題がある可能性もあります。

推奨していただいたwgetですが、Libraryの中にありませんでした。このLinuxは小規模なハードウエアの上で動作するTiny Versionで、現在使用しているFTPクライアントもユーザランドから追加したものです。

ご示唆ありがとうございました。

お礼日時:2011/05/22 21:36

とりあえず出力のログ保存に関してだけであれば、



>&2 >ftpLog.txt

だと、リダイレクトの記述上でログが取れて居ないのではないでしょうか。
標準出力と標準エラー出力の両方共同じファイルに書き出したいのであれば、こうとか

>ftpLog.txt 2>&1

ただしこれだとシェルスクリプト叩くたびにファイルの中身を上書きしてしまうので、追記していきたいならこうですね

>>ftpLog.txt 2>&1

この回答への補足

sholmes様

回答ありがとうございます。
初歩的なリダイレクトが分かりませんでした。修正の結果、Logが取得できました。

1受信ごとに
?Invalid commnad
が3回出ていることが分かりました。

ftp -n ${HOST_NAME} >>ftpLog.txt 2>&1 << _EOF_
user ${USER} ${PASSWORD}
bin
get ${FILE_NAME}
bye
_EOF_

上記シェルスクリプトに含まれるcomandは
ftp -n
以外ありません。
それとも_EOF_で囲まれたftp接続後のcommandに問題があると考えるべきなのでしょうか?。
user=ftp, password=NULL, つまりanonymousであること、あるいは{FILE_NAME}がシェル起動時の引数となっていることが問題となるのか判断できません。
大部分はこのアラームがありながら受信できており、突発的に発生する理由が分かりません。

何かご示唆いただけることがあればお願いいたします。

補足日時:2011/05/21 18:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!