23 10月 2011 @ 4:58 PM 

ftpコマンドでバッチ処理したいときってありますよね。
しょっちゅう同じディレクトリの中身を同じディレクトリに放り込むとか。
じゃ、シェルスクリプト書きましょうということで。
あ、例のごとくWindowsじゃなくてLinuxです

で、今回はFTPS(FTP over SSL)での記述なので、ftpじゃなくてlftp使います。
まあftpでも同じような感じだと思います。

#!/bin/sh

if lftp <<_EOD
set cmd:fail-exit yes
open ftps://ftps.example.com
user hoge hogehoge
cd /remote
lcd /local
mirror -R
quit
_EOD
then
  echo "upload succeeded.\n"
else
  echo "upload failed.\n"
fi

という感じのシェルスクリプトを今回書きました。
内容としては、lftpコマンドで<<_EODから_EODまでを実行させて、実行結果が正常なら成功したよ、失敗したら失敗したよ、と表示させています。

lftpでは

set cmd:fail-exit yes

とすることで、コマンドが失敗したら接続を切ってエラーを返すようにできます。
バッチ処理にはもってこいです。
そのあと、openで接続先をftpsで開いて、userで認証、cdでリモートのファイルを置きたいディレクトリに移動、lcdでローカルの置きたいファイルがあるディレクトリに移動、mirror -Rでローカルのファイルをリモートにミラーしてquitで終了としてます。
このあたりは人によってやりたいことが違うのでご自由にしましょう。
見ての通り認証のパスワードがめっちゃ記述されている(user hoge hogehogeのhogehogeがパスワード)ので、スクリプトのパーミッションには気をつけましょう。

if – then – else – fiの流れはlftpコマンドが成功したらthenで失敗したらelseってことでまあ詳しくはシェルスクリプトでぐぐってください。


Posted By: ゆ。
Last Edit: 23 10月 2011 @ 04:58 PM

EmailPermalinkComments (0)
Tags
Categories: Linux, PC
 23 10月 2011 @ 2:28 AM 

ディスクを交換しろっていうのが一番正解なのはわかってます。

普通にext3とかext4とかで使ってる場合は

e2fsck -cfy /dev/sda1

とかやれば、e2fsckから間接的にbadblocksが呼び出されて不良セクタのファイルシステムへの登録処理を行ってくれるじゃないですか。
Windowsでいうところのchkdsk /Rみたいなもんですよね。
で、たとえば/dev/sda1と/dev/sdb1と/dev/sdc1でRAID5くんでたとして、/dev/sdc1で不良セクタが発生してmdadmに蹴られてfaultマークつけられたとするじゃないですか。
とりあえずremoveしてRAIDから外しますよね。
で、まあなんか一時的なシステムの不具合だった場合またaddしてやればそのまま動いたり、まあ場合によってはリビルドかけるなりすれば復活するわけじゃないですか。
でも、がちでディスクに問題があるっていうか不良セクタが発生していた場合、とりあえず代替処理してやれば動きそうな気がしてるんですよね。
でも、e2fsckから間接的にbadblocksを呼び出す方法だと、RAID5だとリビルドのRead/Writeが平行して走ることになるから駄目っぽいですよね。
じゃあ直接

badblocks -o badblocks.txt -s /dev/sdc1

とかやって不良セクタの発生してるブロックを書き出してやって、

e2fsck -l badblocks.txt /dev/sdc1

とかやって不良ブロックを不良ブロックinodeに登録って普通のext2/3/4ファイルシステムならできるけど、RAID5アレイ上のファイルシステムだとどう考えても駄目ですよね。
ということはファイルシステムが作成される前の段階で代替処理を行わなければならないわけですが、それってどうやるんでしょうか。
表向きにはHDDの不良セクタの代替処理はファームウェアが勝手にやってくれるとのことなわけですが、実際のところ普通に不良セクタが出没します。
そんなHDDのSMART値をみるとReallocated_Sector_Ctは0だったりします。
全くあてになりません。

で、肝心の代替法なんですが、やっと見つけたと思ったらこんなんでした。

該当ブロックを再配置します

[root@www ~]# dd if=/dev/zero of=/dev/hda3 bs=4096 count=1 seek=120
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 6.4496e-05 seconds, 63.5 MB/s

[root@www ~]# sync

これ本当に再配置ですか?
単に問題の箇所をzeroフィルしてるだけにしか見えないんですけど。

ということでbacblocksで見つけた不良箇所をファイルシステムへ登録せずに、代替セクタ処理を行わせたいんだけどもやり方がわからないわけです。
誰か知らないですか。


Posted By: ゆ。
Last Edit: 06 12月 2011 @ 12:47 PM

EmailPermalinkComments (0)
Tags
Categories: Linux, PC

 Last 50 Posts
 Back
Change Theme...
  • Users » 100
  • Posts/Pages » 314
  • Comments » 177
Change Theme...
  • VoidVoid « Default
  • LifeLife
  • EarthEarth
  • WindWind
  • WaterWater
  • FireFire
  • LightLight