[フレーム]
はてなブックマークアプリ

サクサク読めて、
アプリ限定の機能も多数!

アプリで開く

気に入った記事をブックマーク

  • 気に入った記事を保存できます
    保存した記事の一覧は、はてなブックマークで確認・編集ができます
  • 記事を読んだ感想やメモを書き残せます
  • 非公開でブックマークすることもできます
適切な情報に変更

エントリーの編集

loading...

エントリーの編集は全ユーザーに共通の機能です。
必ずガイドラインを一読の上ご利用ください。

タイトルガイドライン

このページのオーナーなので以下のアクションを実行できます

タイトル、本文などの情報を
再取得することができます
コメントを非表示にできます コメント表示の設定

ブックマークしました

ここにツイート内容が記載されます https://b.hatena.ne.jp/URLはspanで囲んでください

Twitterで共有

ONにすると、次回以降このダイアログを飛ばしてTwitterに遷移します

365users がブックマーク コメント 54

ガイドラインをご確認の上、良識あるコメントにご協力ください

0 / 0
入力したタグを追加

現在プライベートモードです 設定を変更する

おすすめタグタグについて

よく使うタグ

bash スクリプトの実行中上書き動作について

365 users zenn.dev/mattn

ガイドラインをご確認の上、良識あるコメントにご協力ください

0 / 0
入力したタグを追加

現在プライベートモードです 設定を変更する

おすすめタグタグについて

よく使うタグ

はてなブックマーク

はてなブックマークで
関心をシェアしよう

みんなの興味と感想が集まることで
新しい発見や、深堀りがもっと楽しく

ユーザー登録

アカウントをお持ちの方はログインページ

記事へのコメント54

  • 注目コメント
  • 新着コメント
ono_matope
開始時に全体をreadしていないのは歴史的にメモリ資源が高価だったからだろうけども、今となっては逐次readのリスクの方が大きく、こわい。

その他
t-tanaka
たぶんそういうことじゃない。二つのスクリプトがあって,AがBを何回も呼び出す。で,Aを実行中にBを書き換えてしまった。書き換え後のBはAが環境変数を設定していることを前提としていたので・・・だと思う。

その他
kuzumimizuku
不勉強で理解できてない部分もあるのだけど(他の言語処理系で起きうる話とか)こういうものとして理解しておこう(しかし不勉強なわりになぜか以前からこういうもの(実行中の上書きは危ない)として認識していた)

その他
lenhai
ls -i でi-node確認すると分かり易い。同一i-nodeに対して読み込み(bash)と書き込みが発生してるのが問題であって、fgetsのアトミック性はあまり関係ない。なおファイル更新はmv(rename(2))でアトミックにやるのが良さそう。

その他
suica_j
あの件元のスクリプトでset -euされていたら救われてたのだろうか

その他
programmablekinoko
一括で読み込んでアトミックにした方が良かったのでは... / JITでプリコンパイルが走るスクリプト言語は当然ながら上書きしないだろうな

その他
OkadaHiroshi
全読込みしないのはメモリ資源が高価だからでなく、全部読み込んでから実行するより逐次実行の方が早いからでは。書き換わったら再度読み込むのは無限ループのあるスクリプトを止めずにパッチを当るためだろうか。

その他
kiririmode
"これは bash の問題ではなく、I/O がアトミックではない事で起きる問題であり、この問題を回避しつつスクリプトを入れ替えるのであれば、スクリプトが停止している事を確認するしかない"

その他
ngyuki
fgetsもまとまった単位でバッファにreadしてそのバッファから1行ごとに返してるだろうからfgetsだけでは説明つかない気もするけれども・・ https://twitter.com/tmtms/status/1476056779973083136 こういうことなの

その他
wtatsuru
"このパーサは fgets(2) で読み込まれつつ実行される為、一括でファイルが読み込まれている訳ではない。"

その他
tmatsuu
わいわい

その他
kabatana
こういう細かく検証してくださる方は本当にありがたいな。

その他
rryu
読み込み中のファイルを更新する可能性は他のものでもある訳で、問題にならないのは大抵は一瞬で終わるので遭遇する確率が低いからなのだろう。

その他
ysik
open(2) した後 write(2) のタイミングで Copy on Write でカーネル内のファイルハンドルを新規に生成して、プロセス毎に異なるファイルハンドルを対応させる実装だったら...。環境変数を使う複数ファイル構成だと無理か...。

その他
kazutanaka
スクリプトはファイル上書きでなく、ユニーク名で新規ファイル設置&シンボリックリンク差し替えなら、実行中プロセスに干渉しない。スクリプトのロールバックも簡単になる。

その他
iekusup
なるほど。

その他
n314
読み込みはともかく、書き込みなら昔はログローテートで一度はハマるものだったような。それでそのときにi-nodeと開きっぱなしのファイルの挙動を知る。

その他
goodstoriez
"Linux の dash(/bin/sh)、zsh では再現、FreeBSD の sh/bash では再現せず。どうやら UNIX System-V だと再現する様です。"

その他
aya_momo
MS-DOSのバッチファイルでもそういうのがあったはず。

その他
sugimori
なるほど〜

その他
otoan52
長く掛かるバッチ処理的の修正をするのに、文字数を合わせて書き換えたことあったな。(個人的な遊びの環境の話だけど)/ cpは書き換えだけど、mvは名前の付け替えだからな。/ for文も読み直すからメモリ対策だよ

その他
ikkitang1211
めっちゃいい記事...!! 勉強になる。

その他
jun_cham
bashはインタプリタ言語じゃなくてshellだからってことだよなあ

その他
tettekete37564
mv か cp かも大きいがファイルシステムによっては mv でもアトミックな挙動をしないのでなんとも。ただ起動中のプロセスを上書きってのは精神衛生上良くないからやりたくないね。

その他
retire2k
ZFSのようなFileSystem(直接上書きされない)ならどうなるんやろ

その他
OkadaHiroshi
OkadaHiroshi 全読込みしないのはメモリ資源が高価だからでなく、全部読み込んでから実行するより逐次実行の方が早いからでは。書き換わったら再度読み込むのは無限ループのあるスクリプトを止めずにパッチを当るためだろうか。

2021年12月30日 リンク

その他
fn7
"これは bash の問題ではなく、I/O がアトミックではない事で起きる問題であり、この問題を回避しつつスクリプトを入れ替えるのであれば、スクリプトが停止している事を確認するしかない。"

その他
ys0000
ちなみにWindowsのbatchでも行読み込みであり、変な編集を加えると実行処理が変わる。なので実行中に編集してはいけない。Powershellは確か起動時に読み込むので大丈夫なハズ(仕様を当たった訳ではないので断言できず

その他
sugawara1991
↓リンク)呼び出し毎にシークしなおしてるなら外部コマンドによるスクリプト自己書き換えを動作成立させるためのシェルの意図的な動作仕様の匂いがする。テクニカルに過ぎるが成立するなら使いたがるタイプ居そう

その他
tamanecoplus
大昔のインタプリタ言語だって大抵は最初にメモリに全ロードしてた。bashが特殊だと思う(思いたい)

その他
zyzy
bash固有の問題ではない、とは言え今メジャーに使われてる奴で同じこと起きそうなのはあんまりなくない?

その他
lenhai
lenhai ls -i でi-node確認すると分かり易い。同一i-nodeに対して読み込み(bash)と書き込みが発生してるのが問題であって、fgetsのアトミック性はあまり関係ない。なおファイル更新はmv(rename(2))でアトミックにやるのが良さそう。

2021年12月29日 リンク

その他
mkusunok
実行時の断面を保持するとか、更新できないようにロックするとか、やればできそうなもんだけど

その他
Windymelt
面白い。開始時に一括読み込みするオプションとかが生えると嬉しそう

その他
remonoil
最近はJITばかりで忘れがちだけどインタプリタってこういうことよな

その他
shikiarai
昔の実装だからそういう可能性もあるだろうなと必ず止まってる時に更新しろ殺されるぞって山の化け物への接し方みたいに口頭伝承で伝えてるけど仕様が細か過ぎて引き続き口頭伝承にしようと思った。

その他
Wafer
テストで復習超大事

その他
kanetann
"bash の問題ではなく、I/O がアトミックではない事で起きる問題"

その他
sgo2
一括読込にしたら組み込みで使えなくなる(ash使えって?そうですね)

その他
ngyuki
ngyuki fgetsもまとまった単位でバッファにreadしてそのバッファから1行ごとに返してるだろうからfgetsだけでは説明つかない気もするけれども・・ https://twitter.com/tmtms/status/1476056779973083136 こういうことなの

2021年12月29日 リンク

その他

注目コメント算出アルゴリズムの一部にLINEヤフー株式会社の「建設的コメント順位付けモデルAPI」を使用しています

リンクを埋め込む

以下のコードをコピーしてサイトに埋め込むことができます

プレビュー
アプリのスクリーンショット
いまの話題をアプリでチェック!
  • バナー広告なし
  • ミュート機能あり
  • ダークモード搭載
アプリをダウンロード

関連記事

usersに達しました!

さんが1番目にブックマークした記事「bash スクリプトの...」が注目されています。

気持ちをシェアしよう

ツイートする

bash スクリプトの実行中上書き動作について

を設定してから再度試した所 bar が表示された。backupcopy は編集中のファイルによって自動で判別する ... を設定してから再度試した所 bar が表示された。backupcopy は編集中のファイルによって自動で判別する auto がデフォルトになっている為、試す際には明示的に yes に設定しないといけない。 bash の実装確認 evalstring.c の parse_and_execute でコマンドが処理されており、input.c の with_input_from_buffered_stream で読み込みの準備が行われている。バッファの読み込みの体は y.tab.c つまりパーサから直接呼ばれており、このパーサは fgets(3) で読み込まれつつ実行される為、一括でファイルが読み込まれている訳ではない。 while/do でループ実行した際に、ファイルを書き換えられたら戻り先はどうなるか、についてはスクリプトはバッファ付きで読み込まれており、そのバッファがファイルシステムから読

ブックマークしたユーザー

  • catapy2024年08月16日 catapy
  • techtech05212023年03月26日 techtech0521
  • mjtai2022年03月23日 mjtai
  • lugecy2022年01月16日 lugecy
  • hamaco2022年01月12日 hamaco
  • nozomu3652022年01月10日 nozomu365
  • nunux2022年01月09日 nunux
  • tmatsuu2022年01月08日 tmatsuu
  • mhag2022年01月04日 mhag
  • machupicchubeta2022年01月02日 machupicchubeta
  • mp0liiu2022年01月02日 mp0liiu
  • lunastera2022年01月02日 lunastera
  • shigeaki1jp2022年01月01日 shigeaki1jp
  • m0t0m0t02022年01月01日 m0t0m0t0
  • kabatana2022年01月01日 kabatana
  • yogasa2021年12月31日 yogasa
  • sskoji2021年12月31日 sskoji
  • imyutaro2021年12月31日 imyutaro
すべてのユーザーの
詳細を表示します

ブックマークしたすべてのユーザー

同じサイトの新着

同じサイトの新着をもっと読む

いま人気の記事

いま人気の記事をもっと読む

いま人気の記事 - テクノロジー

いま人気の記事 - テクノロジーをもっと読む

新着記事 - テクノロジー

新着記事 - テクノロジーをもっと読む

同時期にブックマークされた記事

いま人気の記事 - 企業メディア

企業メディアをもっと読む

はてなブックマーク

公式Twitter

はてなのサービス

Copyright © 2005-2025 Hatena. All Rights Reserved.
設定を変更しましたx

AltStyle によって変換されたページ (->オリジナル) /