Linux shell ftp 転送 エラー制御

このQ&Aのポイント
  • Linuxのshellで、ftpを使ってデータを転送するシェルを作成しています。転送部分はうまくいき、エラー制御を考えているのですが上手くいきません。
  • ftp転送で失敗したかどうかの判定をしたい。ログファイルからエラーNoをgrepして判断しようとしていますが、構文が正常に書けていないようです。
  • エラーナンバーは425(データコネクションをオープンできない)というやつで、もっと適切なエラーナンバーがあれば教えてください。また、/dev/nullの使い方についても教えていただきたいです。
回答を見る
  • ベストアンサー

Linux shell ftp 転送 エラー制御

Linuxのshellで、ftpを使ってデータを転送するシェルを作成しています。 転送部分はうまくいき、エラー制御を考えているのですが上手くいきません。(ログは取得できてます) やりたいことは、ftp転送で失敗したかどうかの判定をしたい。ということです。 過去ログ等見ていて、ログファイルからエラーNoをgrepして判断する。というやり方があったので 試して見ましたが、構文が正常に書けていないようです。すみませんがアドバイスをお願い致します。 ftp転送終了したとします。 ログは $Log_Path/$date.txt にとってあります。 grep ^425 $Log_Path/$date.txt /dev/null if $? eq 0 then error_flag=1 exit 1 fi (エラーが発生したら、error_flagに1が入るようにしたい) エラーナンバーは425(データコネクションをオープンできない)というやつで、いいかなと思っていますが、もっと適切なものがあれば教えて下さい。(putで行っている転送の失敗を判断できればいいです) 上記の構文ではエラーが出ます。 また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか? 宜しくお願い致します。

  • pen123
  • お礼率58% (222/377)

質問者が選んだベストアンサー

  • ベストアンサー
  • ryofurue
  • ベストアンサー率60% (3/5)
回答No.3

grepは、一致した行を画面に出力してしまうので、それを見たくない場合は煩わしい。そのような時には画面出力を捨てます: grep ^425 $Log_Path/$date.txt > /dev/null 不等号記号 ">" に注意して下さい。これは「標準出力を /dev/null というファイルに出しなさい」という意味です。不等号記号は「リダイレクション」という機能ですから、詳しくはリダイレクションの使い方を調べてみてください。また、/dev/null がどういうファイルかも、シェルプログラミング関連で調べられると思います。 あるいは、grep に "-q" (quiet) オプションがあれば、 grep -q ^425 $Log_Path/$date.txt で同じ効果が得られるんじゃないかと思います。 また、"if" は、コマンドを実行しその戻り値を利用するのですから、"if" の直後はコマンドです。従って、 if test $? eq 0 と書きます。"test" というコマンドに "$? eq 0" という式の真偽を計算させるのです。 さらに、それで悪くはないのですが、どうせコマンドの戻り値を使うなら、"if" の後に直接 grep を書いてやればいいじゃないか . . . ということになります。 また、error_flag=1 としたあとに、exit していますが、それではせっかく設定した変数error_flagが無駄になってしまいませんか? 以上のことを考えると if grep ^425 $Log_Path/$date.txt > /dev/null then exit 1 fi になると思います。あとは、個人の好みですが、僕だったらもっと簡潔に (grep ^425 $Log_Path/$date.txt > /dev/null) && exit 1 と書くと思います。 最後にですが、ftpなどの、本来は対話的に使うように出来ているコマンドをスクリプトで使うのは結構辛いです。そこで、"expect" という、対話コマンドをスクリプトから使うためのコマンドもあります。ずっと昔使っていただけで、使い方は忘れてしまいました。また、転送が失敗したかどうか知りたいだけだったら、wgetをftpコマンドの代わりに使う方がずっと楽かも知れません。

pen123
質問者

お礼

とても丁寧な回答ありがとうございます。 非常に解りやすく、参考になりました。 意味のわかっていなかった部分も改善できました。 アドバイスいただいた内容で試して見たいと思います。 ありがとうございました。

その他の回答 (3)

noname#178001
noname#178001
回答No.4

たぶんで申し訳ないんですが、対話的に使用するftpコマンドよりも wgetコマンドを使用したほうがいいと思います。 ログをgrep することなく、wgetコマンドの直後に $? の比較で 済むと思います。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>(エラーが発生したら、error_flagに1が入るようにしたい) そのerror_flagは何者です? シェル内の変数ですか? 環境変数ですか? # どちらにしろ、exitで抜けているので意味ありませんが…。 # シェル内で環境変数を変更しても、親プロセス(呼び出し側)には影響しなかった…かと。 呼び出し側でエラーによる分岐をしたいのであればexitで返却する終了コードで分岐すべき…かと思います。 >上記の構文ではエラーが出ます。 どういうエラーが出ますか? >また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか? なんか抜けていませんかね? grep ^425 $Log_Path/$date.txt > /dev/null なんじゃないですか? /dev/nullへのリダイレクトなら、grepの出力結果を捨てる。というだけです。

pen123
質問者

お礼

回答ありがとうございました。 また、提示情報が不足しておりもうしわけありませんでした。 他の方かも頂いた回答で解決できそうです。 ありがとうございました。

  • 500cii
  • ベストアンサー率50% (14/28)
回答No.1

正しくは grep ^425 $Log_Path/$date.txt > /dev/null if [ $? -eq 0 ]; then #error_flag=1 exit 1 fi だと思います。 grepは正規表現に該当した行を出力するので、それを「 > /dev/null」で表示させないようにします。 ifの比較の文も変更しています。スペースに注意して下さい。 error_flag=1とexit 1ですがどちらか一つにして下さい。 シェルの実行方法は A) ./aaa.sh B) source ./aaa.sh の二通りありますが、Aではサブシェル内で実行され、Bでは現在のシェル内で実行されます。 Aではerror_flag=1が現在のシェルに引き継がれないので、意味を持ちません。 Bではexit 1で現在のシェルを終了させてしまいます(要するにコマンドプロンプトが閉じる)。

pen123
質問者

お礼

迅速な回答ありがとうございました。 不明点も明確になり、理解が増しました。 基本的な部分がわかっておらず申し訳ありません。 徐々に改善していければと思います。 ありがとうございました。

関連するQ&A

  • Linux shell メール転送エラーの判定

    Linuxのシェルでメール転送部分を作成しました。 動作は問題ないのですが、宛先アドレスを入力し間違えて、メールが送信できなかった際のエラーをログに残せず困っています。 下のようなプログラムを組んで、送信に失敗したらログにはきだされるようにしてみたのですが、 メール送信自体は正常終了と判定されてしまいます。 (メール自体は送信できているからだと思います。送った後にエラーで戻ってきてるんでしょうが。) mail -s "$subject" $address -- -f From_Test << mailbody メール本文 mailbody #--------エラー処理 --------- if test $? -ne 0 then echo "Mail sending error" >>$log.txt fi 送信に失敗したことをログに残すにはどうすればいいでしょうか? ご教授下さい。

  • FTP送信エラーの検知について

    Bシェルプログラムで、あるファイルをFTP送信する処理を作っています。そのなかで、もし、FTPでファイル転送を失敗した場合、転送エラーをログファイルなどに残し、ファイルを再送する処理を組みたいのです。 FTPはエラーが判断できない(エラーのReturnがない)と聞きました。なにか、よい方法はないでしょうか?

  • FTP転送エラーについて

    こんにちは。 以下の手順でFTP転送しております。(ポートモード) Window2003 Server → ファイヤーフォール → インターネット → ファイヤーフォール? → FTP Server(海外) 1週間に1回の割合で、下記のようなエラーが発生します。 1日の通信回数は約30回ほどです。 データコネクションは確立されてますので、パッシブモードに変更して も問題は解消されないと見ております。 FTPの経験が浅いのですが、この程度のエラーは想定内として考える べきなのでしょうか? 他のシステムで国内同士のFTPは、まったくエラーにならないのですが・・・。 また、エラーとなる原因等がお分かりになる方がいらっしゃいました ら、アドバイスお願い致します。 220 mailgate Microsoft FTP Service (Version 5.0). 331 Password required for user. 230 User user logged in. FTPサーバへPutします。 ファイル名:/user/file/sample.txt From C:\FTP\data\sample_FCHSHGCD.put 200 Type set to I. 200 PORT command successful. 150 Opening BINARY mode data connection for /user/file/sample.txt. 425 Can't open data connection. //エラー発生 221

  • NTのFTP通信

    こんにちわ Windows NT 4.0 workstationにて(数台) FTP転送したいのですが、 転送するファイル名が固定ではありません。 転送するファイルは以下のようなファイルになります。 yanolog.txt saitolog.txt sayamalog.txt このような場合、下記のputのぶぶんを put *log.txt で実行しても転送されるでしょうか? open ftp.noname.ne.jp bluepixy password ascii put *log.txt close quit よろしくお願いします

  • 自動ftpバッチで転送速度をろぐに出す方法

    こんにちは windows2008で自動ftpバッチファイルを作成ししています。 自動ftpは出来るのですが、転送速度がログに出力されません。 具体的には手動でftpすると以下のように表示される「24000.00KB/秒」という部分を ログに出したいです。 200 PORT command successful. 150 Opening ASCII mode data connection for autoexec.bat. 226 Transfer complete. ftp: 24 バイトが送信されました 0.00秒 24000.00KB/秒。 そもそもログに表示させることはできないのでしょうか? お分かりの方、お教えください。 今作っているバッチファイルはこんな感じです。 ftpauto.txt ---------------- ftp -s:ftpcmd.txt>>ftp.log 2>&1 ftpcmd.txt ---------------- open XX.XX.XX.XX user-id Password bin cd / lcd C:\ put XXX disconnect bye ------------------------------------ 宜しくお願いします。

  • コマンドプロンプト FTPコマンドについて

    こんばんわ。 今回はコマンドプロンプトのFTPコマンドについて質問させてください。 処理概要 Windowsバッチにて、サーバA(Windows)からサーバB(UNIX)にFTPでファイルを複数送りたい その際、FTPが成功したか失敗したかをログファイルに出力したい。 以下プログラム set logDir=C:\hogehoge\log\ set settingFileName=C:\hogehoge\upload.ftp set execDate=%date:~-10,4%%date:~-5,2%%date:~-2,2% set logFileName=%logDir%log_%execDate%.txt echo FTPバッチ起動 >> "%logFileName%" cd C:\hogehoge echo FTP開始 >> "%logFileName%" ftp -s:"%settingFileName% >> "%logFileName%" upload.ftpというファイルには以下のように記述しております。 ftp open サーバIP ポート ログインID パスワード binary prompt mput *.csv bye この2種類のファイルで、FTPは出来るのですが、 どうにかして成功/失敗を判断したいです。 どなたかわかる方、ご教授お願いいたします。 補足 UNIX上のバッチ処理(Cシェル)でもファイルがあるかどうか判断していますが、 WindowsでFTP失敗の場合、メールを送りたくてこのようなバッチを作成しました。

  • シェルスクリプトでエラー時にリトライ方法

    下記のようなシェルスクリプトを作成したいと思っています。 apacheのアクセスログを確認し、 (1)httpステータスが200なら後続の処理を実行 (2)200以外ならエラーを表示させ、  200以外なら5回リトライして5回ともhttpステータス"200"が一度も返ってこなければ(grepに含まれていなければ)スクリプトを中止するような処理を行いたいです。 初心者でループ処理?リトライ処理?というのがよくわかっていなくて… 下記のようなスクリプトにどう手を加えたらいいかご教授いただけますでしょうか。 #!/bin/sh cd /XXX/apache/log if tail -n 5 access_$DATE.log grep "|200|" >/dev/null; then tail -n 5 access_$DATE.log grep "|200|" echo "httpステータスは200です" else echo "httpステータスは200以外です" exit fi : よろしくお願いします

  • FTPで見えるファイルと見えないファイルがあります。

    FTPで見えるファイルと見えないファイルがあります。 CentOS5.4にvsftpdをインストールして、PCからFTP転送を行おうとしています。 /tmpディレクトリにファイルを転送すると、FTPツールに転送したファイルは表示されますが、 元々/tmpにあったファイルはFTP転送ツールに表示され無い状態となっています。 ・FTP転送ツールを再起動しましたが、転送したファイルしか見えません。 又、FTP転送ツールではなく、DOS窓上でFTP接続して、DIRで見た時も転送したファイルしか見えません。 このことから、FTPツールの問題ではなく、FTPサーバー側の問題を判断しました。 ・Linuxサーバを再起動しても、転送したファイルしか見えません。 ・Linuxサーバ上で、転送したファイルを"cp -p"でコピーした場合、コピーしたファイルはFTPツール上見えません。 現在Linux上では、 tmp>ll -rw-r--r-- 1 root root 2 5月 13 17:20 a1.txt -rw-r--r-- 1 root root 2 5月 13 17:20 a2.txt -rw-r--r-- 1 root root 2 5月 13 17:20 b1.txt となっているのですが、 a1.txt:FTP転送したファイル a2.txt:a1.txtを cp -p a1.txt a2.txtでコピーした b1.txt:viで作成した FTPコマンドで見ると、 ftp> dir 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 2 May 13 08:20 a1.txt というようにa1.txtしか見えません。 原因はわかりましたらご教授ください。よろしくお願いいたします。

  • FTPコマンドの戻り値(エラーコード)の意味

    【FTPコマンドの戻り値=”2”は何のエラーを意味するのでしょうか?】 あるアプリからbatファイルを起動する仕組みを作っています。 そのbatファイル内でFTPコマンドによるファイル送信をしていますが、 FTPコマンドの戻り値が正常終了の”0”ではなく”2”となってします。 処理結果をログに出すようにしているのですがそこもうまくいっていないようです。 DOSプロンプトを起動してFTPコマンドを手で入力して行くと ステップごとには正しく動くのですが、bat起動だとだめなのです。 検索してみても「エラーコードの意味」がHitしません。 どなたか教えていただけますか? 【処理詳細を以下に記します。】 内容は、ある制御ファイル(CTL。中身は0バイト)群を FTP転送し、日付入りファイル名のログに結果を出力するだけです。 ○batファイル(引数%1には、アプリから日付が渡されます。) ftp -s:ftpcmd.txt > ftplog_%1.txt ○Txtファイル open xxx.xxx.xxx.xxx (userid) (password) cd (処理ディレクトリ) ascii prompt mput c:\FTP\*.xxx.ctl disconnect bye

  • FTPでのファイル転送失敗

    FTPを使ってファイル転送をしたいのですが、 以下のようなエラーが出てしまいます。 Error opening local file <file名> ローカルファイルが開いているのだと判断したのですが、ローカルコンピュータではファイルは開いておらず、ファイルの保存場所を変更してサイド転送しても同じメッセージがでます。 どうしたらうまくいくのでしょうか?