それとも、ファイルを閉じてオーバーレイをインストールしてからファイルを再度開く必要がありますか?つまり
#!/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.txt
program3
/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
)であっても、そのディレクトリを現在のディレクトリとして扱うプロセスには影響しません。