Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2912

【Bash】スクリプト実行中にスクリプトを書き換えてみる

$
0
0
はじめに 先日、日本ヒューレット・パッカード合同会社が京都大学のスパコンのファイルシステムを消失させてしまったことが話題に。 根本原因はリリース手順の不備なものの、技術的なポイントとしては以下が興味深かったので同事象に関わるテストを実施してみました。 bash は、シェルスクリプトの実行中に適時シェルスクリプトを読み込みます。この挙動による副作用を認識できておらず、実行中のスクリプトが存在している状態でスクリプトの上書きによりリリースしてしまったことで、途中から修正したシェルスクリプトの再読み込みが発生し、結果的に未定義の変数を含む find コマンドが実行されてしまいました。この結果、本来のログディレクトリに保存されたファイルの削除をする処理ではなく、/LARGE0 のファイルを削除してしまいました。(Lustre ファイルシステムのファイル消失についてより抜粋) 再現テスト /tmp配下に変数を書き込むスクリプトを用意。 #!/bin/bash mynum=3 echo "1:mynum is $mynum" > /tmp/memo.txt sleep 10 echo "2:mynum is $mynum" >> /tmp/memo.txt sleep 10 echo "3:mynum is $mynum" >> /tmp/memo.txt これを実行中に以下に差し替えてみる。違いは変数と文字列先頭の数字のみ。 #!/bin/bash mynum=7 echo "4:mynum is $mynum" >> /tmp/memo.txt sleep 10 echo "5:mynum is $mynum" >> /tmp/memo.txt sleep 10 echo "6:mynum is $mynum" >> /tmp/memo.txt 尚、bashのバージョンは以下。 $ bash --version GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) 結果 バックグラウンドで同スクリプトを動かした後に ./test.sh & 急いでファイルを差し替えてみる。 # cp -r test2.sh test.sh cp: overwrite ‘test.sh’? y すると...確かに結果が途中から変わっている。 $ cat memo.txt 1:mynum is 3 4:mynum is 3 5:mynum is 3 所感 スクリプト実行中に該当スクリプトを差し込むとそのタイミングから中身が置き換わる・・というの再現しました。 しかし、環境変数部分は再読み込みされたわけではないので、動きとしてはスクリプト自体が今何行目まで読んだのかを保持していて、逐次最新ファイルを取りにいくような動きに見えますね。とにもかくにも、リリース作業は慎重に・・と思うネットニュースでした。 以上。

Viewing all articles
Browse latest Browse all 2912

Trending Articles