シェルスクリプト総合 その37
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 ・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し 間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。 前スレ: シェルスクリプト総合 その36 https://mevius.5ch.net/test/read.cgi/tech/1614212414/ 関連スレ ・【Bash】Windows Subsystem for Linux【WSL】11 https://mao.5ch.net/test/read.cgi/linux/1627507889/ ・Bashでプログラミング [転載禁止](c)2ch.net https://mao.5ch.net/test/read.cgi/linux/1443885102/ ・シェルスクリプト総合 その28 https://mevius.5ch.net/test/read.cgi/unix/1533154936/ ・zsh その7 https://mevius.5ch.net/test/read.cgi/unix/1337844883/ ・過去UNIXで使われていた ksh というシェルについて https://mevius.5ch.net/test/read.cgi/unix/1582358403/ ・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net https://mevius.5ch.net/test/read.cgi/unix/1443103705/ ・おまえら! shell は何を使っているんですか? https://mevius.5ch.net/test/read.cgi/unix/1012330865/ Lustre の checkpoint 機能は使ってなかったのかな? 規模は違えど今回の事例と同様の体験をした人・組織は少なくなさそう inode云々は問題の表層でしかない 実行中のスクリプトが新しくなったからといって77TBものユーザーデータをサクッと削除しちゃえるのがおかしい 何重にもガードできているのが当たり前の案件 >>426 あくまで「シェル」なんやし、入力を逐次実行するのが仕様やろ? スパコン系の人達は運用周りのリテラシーすごく低い シェルスクリプトしか知らない人達よりもひどいくらい >>434 ファイルの削除処理はJavaで作ればいいんちゃいます? ログもしっかり残してさ >>425 installコマンドを使わないバカが多いからなあ >>426 bashそのものじゃなくてスクリプトの方だぞ >>441 installコマンドでも同じなんだが こういう本物の馬鹿が多いからなあ >>426 bashに限らずevalが使えるスクリプト言語はどれも似たようなもの その方が効率がいいから ファイルを全部メモリに読み込んでたらメモリの無駄遣い。必要になった時に読み込んで コンパイルして中間コードをメモリに保存したほうが効率がいい 書き換えたところから実行する仕様とかじゃなくて 読み込み中にファイル内容が書き換わっただけ #!/bin/sh { # Your stuff goes here exit } って書くと、全部読み込んでから実行する…らしい。 >>444 > bashに限らずevalが使えるスクリプト言語はどれも似たようなもの 知らんけどJK、PerlもRubyも違うやろ。。。 >>446 REPL(Read-Eval-Print Loop)が使えるスクリプト言語あたりが妥当? >>446 検証してないけどPerlとPHPも同じらしい それに厳密に言えばRubyでスクリプトを起動している途中で gemsをアップデートしたらおかしくなる可能性があるやろ? 今から読み込もうとしたライブラリファイルが 中途半端に入れ替わってる可能性がある シェルスクリプトは1ファイルの中で中途半端に 読み込まれて実行されてる可能性があるが 他のスクリプト言語は、それはないかもしれないけど 複数のファイルで構成されてる場合、中途半端に読み込まれて 実行されてる可能性がある そしてバイナリでも動的にライブラリを読み込むようなものがあれば 同じようなことになる可能性がある こういう面倒なことになるからWindowsはアップデートの時に再起動が必要な仕様にしたんだよね ツッコミどころが多すぎるんだよなぁ しいて他山の石とするなら findの結果を直で削除せず チェックしてから削除したほうがいいってことくらいかな >>448 よほど特殊なケースを除いて RubyやPythonでは同じ問題は発生しないよ かと言って実行中に上書きはしないけどな >>451 突っ込みどころが多いのはお前だろ どうやってシェルスクリプトでfindの結果をチェックして削除済んだよ しかもそのチェックコードすら書き換わるって話だろ 何が問題になってるのかわかってない >>452 特殊なケースで発生するって言ってんじゃんw >>448 >それに厳密に言えばRubyでスクリプトを起動している途中で >gemsをアップデートしたらおかしくなる可能性があるやろ? そういう運用を前提にするなら起動途中にgemをアップデートしてもおかしくならないように作ればいい シェルスクリプトの場合{ } で全体をくくって作ればおかしくならない >>448 それは>>444 とほとんど関係のない話。 実行中とロード中は違う。 論点ずらしはやめろや。 >>447 要するに、シェル系だけなんちゃうの?w >>450 Linuxは、実は再起動が必要なときでも、システムがそれを認知しないだけやったりするからな。。。 考えてみると、システムのsoファイルを更新しまくっても再起動不要なのはヤバいやろ。w とりあえず手持ちの(Ubuntu20.04のデフォルト)環境だと testと表示される ``` #!/bin/sh echo echo test >> $0 ``` testと表示される ``` #!/bin/sh { echo echo test >> $0 } ``` testと表示されない ``` #!/usr/bin/python3 import sys with open(sys.argv[0], "a")as f: f.write("print('test')") ``` /bin/sh はファイルを展開したまま参照してるけど、 /usr/bin/python3 は一度どっかにコピー(構文解析済みキャッシュ)してるから実行中の上書きが反映されない感じだと思う >>458 いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。 リスクを心配したいんかしたないんか、どっちやねん?w >>453 君のところでは実行中に直接上書きするのが当たり前なの? うちではそんなことしないから考慮する必要ないんだよね 削除に至るまでのセーフガードが他にもいくつかあるからあえて教訓を得るなら削除前のチェックかなって話 プログラム上書きで動作を変えられるというのは、ある意味脆弱性と言えるかな 権限奪われた後でしか起こせないけど Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う Perl で動的というと eval に文字列引き渡した場合と require でソース読んだ場合かな シェルで言うと eval とドットや soure でのソース読み込み >>443 説明が足りないんじゃない? 単一のシェルスクリプトの場合は、更新時にinodeが変わってれば大丈夫。で終わり。 シェルスクリプトから、別のシェルスクリプトを読んでる場合は、 読み込む行でpathを評価するから、 読み込むシェルスクリプトだけが新しくなって、読み出し元シェルスクリプトが環境変数を持たない結果、同じ事象が発生する可能性はある。 だから、 installを使ったからと言って、すべてのトラブルを避けられるわけではない と言うのであれば妥当 そこは重大な障害に至った本質的な原因じゃないからな >>459 スクリプト系は実行中にロードするんだよ 該当の行まで実行しないとgemsが読み込まれない 実行前に全てのライブラリを読み込むわけではない >>463 > いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。 { exit } 閉じカッコの後が実行されるとでも思ってんの? >>467 installはcpと同じ挙動をするんだから 解決策になってないって言ってるんだが理解してるか? >>466 > Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う PerlとPHPはシェルと同じ問題がある 調べてから書き込め >>464 お前何の話してんの? > findの結果を直で削除せず > チェックしてから削除したほうがいいってことくらいかな が意味不明って言ってるだけやろ ティム・クックCEOとのランチには5,500円ではなく5,500万円以上必要! Appleのティム・クックCEOとのランチをする権利のチャリティーオークションが終了しました。 結果は51,500ドル以上(約5,500万円以上)で落札されたそうです。 このオークション、落札者にはティム・クックCEOとランチができる権利とAppleイベントの 基調講演に参加できるVIPパス2枚がついてきます。 2013年は約6,200万円、2014年は約3,300万円、2015年は約2,400万円で落札されていました。 今回は約5,500万円なので高値で落札されていますね。 しかしお高いランチ代。いったい誰が落札したんでしょうか。 >>471 installについてだけ突っ込んでるけど、 文書の本質は、inodeか変わる場合は、という意味で話してるのは理解してるか? mvで上書きするとinode変わると信じてるけど、 installつかったすべての状況で、inode変わるかまでは分からないから、 installを例に挙げたのが悪かったのは認める。 だーかーらーinstall使っても inodeは変わらないって言ってんだろ 信じてるとかじゃなくて、ちゃんと調べろ >>478 本質でないinstallについてだけツッコミたいということは理解した >>479 これのどこにinstall以外の本質の話が書いてあるんだアホか? 441 名前:デフォルトの名無しさん[sage] 投稿日:2021/12/30(木) 02:02:44.37 ID:bPzpLvLZ [1/2] >>425 installコマンドを使わないバカが多いからなあ >>469 実行中に別モジュールをロードするんであって、スクリプト自身は構文木にコンパイル済み。 >>444 にはほとんど関係のない話。 シェルスクリプトには実行エラーしかないけど、Perlとかは実行前にシンタックスエラーになるのはなぜだと思うの?w https://stackoverflow.com/questions/21096478/overwrite-executing-bash-script-files The { forces the shell to read at least through the matching } in order to properly parse the command, and the exit then makes sure it'll never try to execute anything that gets added after that }. BTW, I was testing this with bash version 3.2.48(1)-release (on OS X 10.8.5); other versions may behave differently... UPDATE: Other versions do indeed behave differently. I tried the same test with version 4.3.0(1)-release (under NetBSD 6.1.4), and it continued to run the old code after the file's contents had been replaced. Apparently it now buffers the file in 8KB blocks (see this unix.se answer). Under bash 5..0.3(1)-release on linux, it reads in 8KB blocks... but this doesn't prevent the error (in the version without the {}s), because, after the sleep is done, it seeks back to the position in the file just after the sleep! Strange behavior. {}s still protect it, good answer. >>470 非現実的な解決策w >>444 で知ったかぶりして嘘書いちゃったもんだから引けなくなったのかなww お前は { ...; exit;} での対策が無効と思ってるのか? それともそんな面倒なこと徹底できるわけないと思ってるのか? >ファイルを全部メモリに読み込んでたらメモリの無駄遣い メモリの無駄遣いじゃなかったの? >>484 え?どこが非現実的なんだ? お前のキーボードでは}が打てないとかそういう話か? { お前のコード exit } >>486 メモリの無駄づかいだから 小さな内部形式に変換するんですが? 例えばコメントとかメモリに置いておく必要はないよな 空白もそのままメモリに保持するのはメモリの無駄遣いでしかない bashスクリプトは実行完了するまでスクリプトファイルをcloseしないでしょ 内部形式の変換だが知らんがコピーした分だけ余計メモリに使うから >>488 以降は同意できん >>490 わからないの?コンパイラの仕組みとか勉強したほうが良いよ。 >>491 > コピーした分だけ余計メモリに使うから 何をコピーするんだよw まさか起動中はメモリを解放できないとか思ってるのか? >>494 自分でわからないって言っただろ わからないなら、自分で勉強するか わからない所を具体的に聞け ちゃんと教えてやるぞw まあ俺は優しいから教えてやろうw { echo '#!/bin/sh'; printf '#%100s\n' {1..1000000}; echo sleep 30; echo end; } > scr.sh これで100MBぐらいのシェルスクリプトができる これを実行しても3MBぐらいしかメモリは食わない 内部形式は小さいからだ これを全部メモリに蓄えておくと100MB以上消費する 最初にパースして内部形式にする方式は 後ろにバイナリとかがついている時ににエラーになるから使えない { echo '#!/bin/sh'; echo '{'; printf 'printf %s\n' {1..1000000}; echo sleep 30; echo '}'; } > scr.sh 「内部形式は小さいからだ」wwwww echo "あけおめ $(TZ=Asia/Tokyo date +%Y)" 今回のケースって世代バックアップとかやってたとしても それを掴んでたバックアップスクリプト自体が上書きされて暴走して余計なファイルまで全消ししたわけだよね >実行中のスクリプトが存在している状態でスクリプトの上書きによりリリースしてしまった 問題はここだけだと思うんだけど 酷く杜撰な運用に見える *nix使いってこの程度のITリテラシーしかないんだね 気持ち悪い >>500 本気でやったら、金も時間もかなりかかりそうやからなあ。 やらかしでしかないんでいいわけのしようもないんやろけど、そこはあんまり重視してなかったんやろ。 >>500 マジでこれな 特殊な事例かと思ったがこのスレ見る限り似たようなレベルのやつが多数 >>501 実行中なら中断するか終了を待ってから新しいのをリリースすればいいだけだろ 日次バッチを中断したり終了を待つのに金も時間もかなりかかるのかい? 他にも例えば権限管理をまともにしてれば防げたよね? >>500 バックアップ容量が多いと、書き込み先の書き込み速度以上のスピードはでないから、 複数世代バックアップするにも、ずっーとバックアップというかコピーというかの処理をし続けることになる。 月次フルバックアップ処理中に、次の増分バックアップ処理が始まるのはテープの場合はよくある。 今回は復元不能と言っていることから過去のバックアップも消えてそうでD2Dっぽいけど、 そういう設計なら基本的にスクリプトは止められないから、 止まったときに更新するんじゃなく、 別のスクリプトをリリースして、古いスクリプトを退役させるような方式を選ぶと思う。 毎日すぐに処理が終わるようなスクリプトしか目にしてないエンジニアが、 そんな設計とは知らず、そのまま更新しちゃったとかそんな理由なんじゃないかなあ? >>503 そんなのなら本気やないな。w テラバイトレベルのバックアップをしっかり実装すんのはなかなかやと思うが。 「日次」でいけるかどうかもあやしいやろ。 クリティカルなシステムでもなし、ただ甘く見てた、てところやろうとは思うが。 >>505 長時間かかる処理は普通suspend/resumeできるようにするよね? 自作しなくても市販のソフト買ってもいいし 日次で終わるかどうかは障害とは関係ないが ミラーリングなのに日次で終わらないようなら作りが悪いよ それにバックアップスクリプトに削除を混ぜるのがそもそも間違い ジョブの単位や依存関係の管理が杜撰 >>506 世代バックアップするなら旧世代のバックアップを削除すべきだろうし、 スクリプトで作った一時ファイルは、そのスクリプトで消すべきだと思う。 やはりスクリプトの更新方法の不備かと。 >>507 OSはLinuxやで Cray用のソフトも普通に売ってるで 知らんだけやろww >>508 世代バックアップちゃうで 今回の障害を受けて世代バックアップ検討しますて書いとるやろ >>475 俺、ティム・クックと0円でランチを一緒にしたことあるぞ。 例の宇宙船にほど近いレストランのカウンター席でメシを食ってたら隣に誰か座ってきた。 その人は電話をしまくってて、落ち着かねー奴だなーと思って顔をよく見たら... !!! >>509 > OSはLinuxやで それはカーネルやろ。 > Cray用のソフトも普通に売ってるで どこの店でどんなふうに? いわゆる「市販」とちゃうやろ。 >>498 それ内部形式じゃないぞ? 100MBのシェルスクリプトのソースコードを生成してるだけ 100MBのシェルスクリプトを実行してもわずかのメモリしか消費しない 内部形式は小さいからだ! やっぱアホの子はお前の方?w >>514 off-the-shelf softwareの日本語訳だよ そこら辺の電気屋さんとかで買えるという意味の市販とは確かに違うが 市販ソフトって言葉は文脈によってもう少し広い意味になるよ 勉強になった? >>516 勝手に文脈をつくんなや。 で、どこで売ってんの? >>517 Linux用でいいのでは? https://support.hpe.com/hpesc/public/docDisplay?docId=a00109703ja_jp& ;docLocale=ja_JP オペレーティングシステム HPE Cray Linux Environment HPE Cray Programming Environment Intel Parallel Studio XE (およびIntel MPI) PGI Professional Edition GNUコンパイラコレクション Rogue Wave SoftwareのTotalView AMD AOCC Vampir GNUコンパイラ https://www.hpe.com/jp/ja/product-catalog/detail/pip.hpe-cray-operating-system.1012842044.html HPE Cray OSは、ハイパフォーマンスコンピューティング向けに機能強化された SUSER Linux Enterprise Server (SLES) をベースとしています。 ふむ。SUSEのパッケージ全部動きそうだけど? >>508 処理をどので分割すべきか理解してない典型例 cronのような原始的なのしか使ったことないでしょ *nix系あるある >>519 それで動作保証まですんのはなかなかのチャレンジャーやと思うが。w そんなことより、どこで売ってんの? >>521 石北会計?w UNIX系あるあるなのは認める。 だが、それでいい。 >>472 LinuxでPerlで実験してみたが同じ問題は出なかったぞ。 $0 のファイルにプログラムを追加書き込みしてもその部分は実行されない。 シェルで同様に$0に追加書き込みしたらその部分は実行された。 >>524 嘘つきに騙されんなよ PerlもPHPもRubyもPythonもJavaScriptも問題ない シェル特有 だよなあ。eval や動的にソース読んで実行する個所以外は問題ないよなあ。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる