Overlayfsは開いたファイルを自動的に動的にリダイレクトしますか?

Overlayfsは開いたファイルを自動的に動的にリダイレクトしますか?

それとも、ファイルを閉じてオーバーレイをインストールしてからファイルを再度開く必要がありますか?つまり

#!/bin/bash
my_background_process >log.txt &
...
pkill my_background_process
mount overlay
my_background_process >>log.txt &
...

それは必要ですか?

答え1

ファイルが開かれると、プロセスはファイルを閉じるまで開いたままになります。ファイルの読み書きは、ファイルが元の名前でまだ使用可能かどうかは関係ありません。ファイル名が変更された、削除された、または非表示になっている可能性があります。それでも同じファイルです。

ファイルを開いて/somewhere/somefileファイルシステムをマウントすると、新しいファイルシステムに/somewhereファイルが割り当てられます。/somewhere/somefileしかし、これはあなたがそれをオンにした場合にのみ重要です/somewhere/somefile。元のファイルシステムでプロセスがすでに/somewhere/somefile開いている場合は変更されません。

シェルがリダイレクト演算子を処理すると、リダイレクトはファイルを開きます。その後、複数のプロセスが関係していても、同じオープンファイルです。たとえば、次のコードスニペットでは、ルートパーティションのファイルはに書き込まれ、にprogram2書き込まれます。/mnt/log.txtprogram3/log.txt/dev/something

do_stuff () {
  program1
  mount /dev/something /mnt
  program2
  program3 >/mnt/log.txt
}
do_stuff >/mnt/log.txt

プログラムの起動後に出力位置を変更するには、プログラムに要求する必要があります。理論的には、デバッガを使用してプログラムにこれを実行させることができます。 このスレッドこれを行うことができるいくつかのプログラムがリストされています。ただし、そのようなプログラムを掘り下げると、プログラムが中断される可能性があります。

プログラムの出力を途中で変更する必要がある場合は、独自の出力を変更できるヘルパーを介して出力を渡す必要があります。以下は、シェルスクリプトの小さな概念証明です。

my_background_process | {
  while IFS= read -r line; do
    printf '%s\n' "$line" >>/mnt/log.txt
  done
} &

スクリプトは各行の出力ファイルを開くため、指定されたファイルが変更されると/mnt/log.txt(ファイルの移動、新しいファイルシステムのマウント/mntなどのため)、後続の行が新しいファイルに書き込まれます。ディレクトリ名を指定する必要があります。を使用すると、>log.txt常に現在のディレクトリのファイルが開き、インストール操作の影響を受けません。 (現在のディレクトリは開いたファイルのように動作します。何かがインストールされます。in/mnt現在のディレクトリが/mnt)であっても、そのディレクトリを現在のディレクトリとして扱うプロセスには影響しません。

答え2

Linuxは、任意のファイルシステムで開かれたファイルの自動リダイレクトをサポートしません。これは直接行う必要があります。

関連情報