ラベル シェルスクリプト の投稿を表示しています。 すべての投稿を表示
ラベル シェルスクリプト の投稿を表示しています。 すべての投稿を表示

2012年5月31日木曜日

[Jenkins]Androidのエミュレータが動かない[iptables]

JenkinsのAndroid Emulator Plugin を利用して、CIをしているが

今日、なぜかエミュレータが立ち上がらない不具合が発生した。


$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb start-server
[android] Starting Android emulator
[android] Erasing existing emulator data...
$ /var/lib/jenkins/tools/android-sdk/tools/emulator -no-boot-anim -ports 47334,36406 -prop persist.sys.language=en -prop persist.sys.country=US -avd hudson_en-US_800_WVGA_android-8 -no-snapshot-load -no-snapshot-save -wipe-data -no-window
WARNING: Cache partition already in use. Changes will not persist!
emulator: warning: opening audio output failed

ERROR: Timeout after 5 seconds
[android] Emulator did not appear to start; giving up
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb disconnect localhost:36406
[android] Stopping Android emulator
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb kill-server
Archiving artifacts
Finished: NOT_BUILT

結局、原因はiiptablesの設定だった。

adb の待ちポートへのアクセスをlocalhostを含めて全て遮断していたためだった。

3時間くらいこれで詰まった・・・馬鹿らしい・・・。

まあ、今後同じ様な問題に出会った際の対応はこれでできたと、そうしておこう。

2012年3月18日日曜日

[シェルスクリプト]デバッグを使ってコーデング[cygwin]





昨日の続きで、シェルスクリプトのデバッグ機能を利用してコードを書く。

今回やろうとしているのは、dfコマンドで取得したハードディスクの使用率が80%を超えている物を出力しようと言う物。

最初に書いたコードは以下

 #!/bin/sh

df | while read target; do
         usage=`echo $target | awk '$1 ~ /:$/ {print $5;}' | sed s/%//g`
         if [ $usage -ge 70 ]; then
                 volume=`echo $target | awk '{print $1;}'`
                 echo $volume is used $usage %...
         fi
done


4行目のawkで、Windowsのパーティションの情報のみを正規表現で得ている、つもり、なのだがうまく動いていない。

ちなみに、dfコマンドの出力結果は


\ファイルシス   1K-ブロック      使用    使用可 使用% マウント位置
E:/cygwin/bin     74035520  33040348  40995172   45% /usr/bin
E:/cygwin/lib     74035520  33040348  40995172   45% /usr/lib
E:/cygwin         74035520  33040348  40995172   45% /
C:               167132192 117595092  49537100   71% /cygdrive/c
D:               732555928 386095748 346460180   53% /cygdrive/d
E:                74035520  33040348  40995172   45% /cygdrive/e
F:                51705168    292732  51412436    1% /cygdrive/f
G:               472576040  76612632 395963408   17% /cygdrive/g
H:               594027440 184795676 409231764   32% /cygdrive/h
I:               594035472  93392484 500642988   16% /cygdrive/i
J:               732563992 414357640 318206352   57% /cygdrive/j
K:               488391676 368850304 119541372   76% /cygdrive/k
L:                 6918814   6918814         0  100% /cygdrive/l
Y:               356670332 102977136 253693196   29% /cygdrive/y


こんな感じ。1フィールド目が : で終わるもののみを取得している、つもり。うーん・・・

こういうことも

sh -x

で分かる。上記のコードを実行すると


+ df
+ read target
++ echo $'\203t\203@\203C\203\213\203V\203X' $'1K-\203u\203\215\203b\203N' $'\216g\227p' $'\216g\227p\211\302' $'\216g\227p%' 'マウント位置'
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo E:/cygwin/bin 74035520 33040348 40995172 45% /usr/bin
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo E:/cygwin/lib 74035520 33040348 40995172 45% /usr/lib
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo E:/cygwin 74035520 33040348 40995172 45% /
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo C: 167132192 117588328 49543864 71% /cygdrive/c
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=71


変数$usageの中に適切な値が入っていないので、if文で怒られているわけだ。と、まあここまで書いて気づいたけど、awkは確かに処理をしていない。

というか、処理をしていないからこそ、usage変数に何も入らなくなってifで怒られている。

どうすれば良いのか・・・

ちなみに今回の場合、目的を達成するだけであればawkのみを利用して

#!/bin/sh

df | awk '$1 ~ /:$/ {sub(/%/,"",$5); if($5+0 >= 70) print $1 " is used " $5"%"}'


そんな、目的と手段を見失った日曜の午前中・・・。

シェルスクリプトでデバッグ

USP友の会 なる組織があることを初めて知りました。

以前書いた、VMwareEsxiのバックアップスクリプトの動きがおかしかった。

コメントアウトをしたり、色々と調べた結果、スナップショットの作成時点でコケていた模様。

#vim-cmd vmsvc/getallvms

で、全ての仮想マシンの名前やIDを得ることができる。スナップショットを作るための

#vim-cmd vmsvc/snapshot.create

は引数に仮想マシンのIDをとるので、awkを使って

vim-cmd vmsvc/getallvms | awk '/$1/ {print $1;}'

で、ID部分のみを取得できる、はずだった。

しかし、動かない。awkの文法で何かをミスっているらしい。

結論から言うと

vim-cmd vmsvc/getallvms | awk '/'$1'/ {print $1;}'

が正解。標準入力からの引数を文字として認識してしまっていたらしい。

で、調査方法だけどUSP友の会の会長さん(@usptomo)さんが拾ってくれた

sh -vx

こんなのあったんだな。


っていうか シェル デバッグ で検索すると沢山引っかかる・・・検索方法が悪かったですorz

2012年1月12日木曜日

timeコマンドをパイプでつなぐ

Linuxのtimeコマンドをパイプとかで繋ぎたいんだよって、話。

time ls -la | grep sys

じゃ、だめです。timeは、標準エラー出力なんだ。そこで

time ls -la 2>&1 | grep sys

でも、だめなんだ。
timeの出力をリダイレクト

を、見るまで知らなかったパイプの仕様。

>1行全て実行した後に時間が出力されるの

とのこと。そこで

(time ls -la ) 2>&1 | grep sys

とするのが正解。

覚えておいて損は無いね。

2012年1月7日土曜日

Windowsタスクスケジューラとシェルスクリプトを使って、サーバーのバックアップを自動化したい

この記事を読んだ。

>PCのバックアップやデフラグなど、ソフト側でスケジュール化できるものは自動化を優先し

あー、やっぱりバックアップは自動化するべきなんだなぁ・・・。

家のサーバーのバックアップは手動で

1. VMWareESXi上で、仮想ハードディスクをコピー

2. サブマシンにコピー

3. 外付けハードディスクにコピー

を行なっている。基本的に週一で、土曜日に行う。

手動で、しかもサブマシンはLAN外には公開していないので外出時にはバックアップを取ることができないといえば、できない。

ちょっと、問題には思っていた。

という訳で、バックアップ処理の自動化を行うべくスクリプトを書く。

今回は、Cygwin上でSSHのリモートコマンドを実行し、最終的にサブマシンにコピーする部分までを一気に行う。

外付けハードディスクは、実は常時通電をしておらず、バックアップの時のみ手動で電源を入れている。この作業の自動化は今回は見送る。

と言うか、無理なんじゃないだろうか・・・?

これが、今回用意したスクリプト
backup.sh

backup.sh
#!/bin/sh

USER_NAME=user_name
HOST_NAME=host_name_OR_ip_adress
BACKUP_CMD=vmfs/volumes/DateStore1/backup.sh

TARGETS="Server1 Server2"

STORE_DIR=/cygdrive/G

delete_old_data(){
        ssh $USER_NAME@$HOST_NAME rm -rf /vmfs/volumes/DateStore2/*
}

delete_old_data

for target in $TARGETS; do
        ssh $USER_NAME@$HOST_NAME $BACKUP_CMD $target
done

scp $USER_NAME@$HOST_NAME:~/vmfs/volumes/DateStore2/* $STORE_DIR

delete_old_data


ま、これだけですね。
$BACKUP_CMDは事前に用意したVMWareESXiで仮想ハードディスクをコピーするためのコマンド。このサイトを参考に作った。

ちなみに、参考サイトではCRONを使って自動化を行なっている。というのも、別のNFS別のサーバーにコピーしたファイルを転送しているため。

今回は、サブマシンがWindowsなのでその手段がとれない(できるけど、面倒くさい)。

Winndowsと言うことで、自動化はタスクスケジューラを使う。

コントロールパネル→管理ツール→タスクスケジューラ

”基本タスクの作成”

から、名前と説明を入力し

トリガー:毎週
    毎週:開始日、間隔、曜日を設定。

操作:プログラムの実行
    プログラムの開始:sh.exeのパスをプログラム/スクリプトに、さっき書いたスクリプトのパスを、引数の追加(オプションん)に入力。
   
これで完了ですね。

設定が正しいかどうかは、追加したタスクを選択して実行をクリックする。

これで、バックアップも自動で行えるようになりました。

あとは、アップデートかなぁ・・・?サーバーたちのアップデートは毎晩行うように設定してありますが、Windowsマシンはどうでもないので。

これは、大したことでもないでしょうね。