열린 파일 복원

열린 파일 복원

해결책이 있을 수도 있고 없을 수도 있는 흥미로운 문제가 있지만 가능하다면 하나 갖고 싶습니다.

Solaris에서는 열린 로그 파일이 제거되었습니다. 이 파일은 프로세스가 실행되는 동안 계속 채워지지만 이제 , 등과 같은 다른 모든 도구에서 액세스할 수 cat없습니다 tail.

모든 것이 계속 실행되는 동안 디렉터리의 항목을 이 파일로 복원할 수 있는 방법이 있습니까?

답변1

일부 해킹 및 제한 사항이 있지만 가능합니다(루트 권한이 필요함).

먼저 로그 파일을 작성하기 위해 애플리케이션을 사용하는 파일 설명자가 무엇인지 찾은 다음 이전 로그 파일 위치에 심볼릭 링크를 만들고 파일 /proc 항목을 가리킵니다. 예:

ln -s /var/tmp/file.log /proc/12345/fd/3

첫 번째 제한은 파일이 프로세스에서 쓰기용으로만 열린 경우 해당 권한으로 인해 권한이 없는 사용자가 해당 내용을 읽을 수 없다는 것입니다. 그러나 file_dac_read 권한이 있는 루트 및 사용자는 영향을 받지 않습니다. 또는 tailGilles가 그의 의견에서 제안한 것과 같은 파일 내용을 복사하는 프로세스를 사용할 수 있습니다 . 예:

tail -c +1 -f /proc/12345/fd/5 > /var/tmp/file.log

두 번째 문제는 프로세스가 파일을 닫거나 종료할 때 파일 내용 전체( ln -s) 또는 일부( ) 가 손실된다는 것입니다 .tail -c 1 -f

해결 방법은 이 이벤트를 모니터링하는 프로그램을 사용하고 close가 실제로 호출되기 전에 파일을 백업하는 것입니다.

작업을 수행하는 도구로는 dtrace, truss, mdb 또는 dbx가 있습니다.

다음은 Solaris 10에서 dtrace를 사용한 개념 증명입니다.

#!/bin/ksh
#
# This dtrace script is monitoring a file descriptor for a given process
# and copy its content to the given path when the file is closed.
#

pid=${1:?"$0: Usage: pid fd path"}
fd=${2:?}
path=${3:?}
[[ -f $path ]] && { echo "$path exists"; exit 1; }
dtrace -w -n '
syscall::close:entry
/pid=='$pid' && arg0=='$fd'/
{
        stop();
        system("cp /proc/%d/fd/%d %s",pid,arg0,"'"$path"'");
        system("prun %d",pid);
        exit(0);
}'

관련 정보