1

私はこのようなスクリプトを持っています、

#!/bin/bash

echo "hello" > a.txt

while [ True ]; do

#do something here, very long and possiblely causing system reboot

done

実行が正常に終了した場合、通常のa.txt(「hello」を含む)しか取得できないようです。「while ループ」が実行されている場合、または while ループ中にシステムの再起動がトリガーされた場合、空白の a.txt が存在します。

Google で検索すると、シェルはデフォルトで行バッファリングをオンにするため、行バッファリングの問題であると思われました。カスタマイズしたUbuntuに「Expect」または「stdbuf」がインストールされていないため、置き換えてみました

echo "hello" > a.txt

ラインバッファが無効になっているPerl/Cプログラムで。Perlでは、「$|」を使用しました 「fflush」は C で使用されました。残念ながら、動作しません。

どんなフィードバックでも大歓迎です...

4

2 に答える 2

3

それは正確には真実ではありません。エコーの後、ファイルが書き込まれ、他のプログラムから見えるようになります。それは保証されています。

この時点では、ファイルが物理ディスクに書き込まれていない可能性があります。これは、OS のファイルシステムのバッファリングが原因で発生する可能性があります。ファイルが書き込まれ、他のプログラムがそれを認識したからといって、それがディスクに書き出されたとは限りません。記憶に残っているだけかもしれません。

「sync」コマンドを使用して、バッファリングされたすべての書き込みディスクをフラッシュするように OS に要求できます。再起動をトリガーする前にそれを呼び出して、問題が解決するかどうかを確認してください。

syncユーティリティを呼び出して、shutdown(8) によって適切に実行されない方法でプロセッサが停止する前に、すべてのディスク書き込みが完了していることを確認できます。

于 2013-04-01T01:36:55.737 に答える