私に命令があれば
$ ./script >> file.log
2回呼び出され、最初の呼び出しが終了する前に2番目の呼び出しが発生した場合はどうなりますか?
最初の呼び出しは出力ファイルの排他的ロックを取得しますか?もしそうなら、書き込みを試みるときに2番目のスクリプトが失敗しますか、それともシェルが出力を受け入れ(スクリプトを終了することを許可します)、エラーが発生しますか?
それとも、ログファイルは2回記録されますか?
答え1
Unixシステムは通常強制ロックを避けます。場合によっては、カーネルがユーザープログラムによる変更を防ぐためにファイルをロックしますが、単に別のプログラムからファイルを書き込む場合はそうではありません。どのUNIXシステムもプログラムがファイルに書き込んでいるため、ファイルをロックしません。
スクリプトの同時インスタンスが互いに干渉しないようにするには、明示的なロック機構を使用する必要があります。flock
lockfile
。
追加するためにファイルを開くと(該当する場合>>
)、すべてのプログラムは常にファイルの最後に書き込むことが保証されます。したがって、複数のインスタンスの出力は互いに上書きされず、順番に書き込む場合、出力は作成された順序と同じです。
起こり得る悪いことは、インスタンスの1つが複数の出力ブロックを書き込んで一緒に出力されると予想する場合です。あるインスタンスの連続書き込み間で別のインスタンスが独自の書き込みを実行できます。たとえば、インスタンス1が書き込まれ、foo
インスタンス2が書き込まれ、hello
インスタンス2のみが書き込まれると、bar
ファイルにが含まれますfoohellobar
。
プロセスがシステムコールを呼び出すと、ファイルに効果的に書き込まれますwrite
。プログラムへの呼び出しはwrite
アトミックです。各呼び出しは、write
他のプログラムによって中断できない一連のバイトを書き込みます。通常、単一の呼び出しで効果的に書き込むことができるデータ量には制限がありますwrite
。大きいサイズの場合は、データの先頭のみが記録され、アプリケーションは再度write
呼び出す必要があります。また、多くのプログラムが実行されます。バッファー:メモリ領域にデータを蓄積した後、このデータをブロックに書き込みます。一部のプログラムは、1行または他の意味のある分離を完了した後に出力バッファをフラッシュします。これらのプログラムを使用すると、長すぎない限り(最大数キロバイト、オペレーティングシステムによって異なります)、行全体が中断されないことを期待できます。プログラムが意味のある場所でフラッシュされず、バッファサイズによってフラッシュされる場合、あるインスタンスでは4kB、別のインスタンスでは4kB、最初のインスタンスでは4kBなどが表示されることがあります。
答え2
追加を意味するを使用しているため、>>
各インスタンスのすべての出力行は発生順に追加されます。
スクリプト出力が印刷され、1\n
各5\n
出力間に1秒の遅延があり、インスタンス2が2.5秒後に開始されると、次の結果が得られます。
1
2
1
3
2
4
3
5
4
5
したがって、あなたの質問に答える場合:いいえ。