
아니면 파일을 닫고 오버레이를 설치한 다음 파일을 다시 열어야 합니까? 즉
#!/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
)인 경우에도 해당 디렉토리를 현재 디렉토리로 처리하는 프로세스에는 영향을 주지 않습니다.
답변2
Linux는 임의 파일 시스템에서 열린 파일의 자동 리디렉션을 지원하지 않습니다. 이 작업은 직접 수행해야 합니다.