2013-08-19 4 views
1
#!/bin/bash 
python /home/sites/myapp/Main.py &> /home/sites/myapp/logs/init.log & 

이 스크립트는 약 1G/week의 로그를 생성합니다.
런타임 중에 수동으로 init.log를 삭제하고 스크립트를 다시 시작하지 않으면 데이터가 누락 된 init.log에 저장됩니다. 스크립트가 다시 시작되면 init.log가 다시 표시됩니다.런타임 중에 로그 파일을 수동으로 삭제할 때 bash 스크립트는 stdout 및 stderr를 어디에 저장합니까?

로그를 볼 수있는 유일한 방법으로 스크립트를 다시 시작 하시겠습니까?

답변

2

유닉스 시스템 init.log이 생성되면 이 생성됩니다. 해당 파일에 대한 모든 참조를 계산하는 카운터가 모두 inode입니다. 참조 란 하드 링크 또는 파일을 열 때를 ​​의미합니다. 이 카운터가 0으로 되돌아 가면 파일이 삭제됩니다. 표준 출력이 init.loginode로 재 그래서

이 디렉토리 엔트리에 의해 참조, 때문에 open의 계산 카운터 값이을 (가지고 있습니다. rm은() unlink 함수를 사용하여 파일을 삭제하면 파일이 있으므로,이 카운터는 1이 될 디렉토리 엔트리에 의해 참조하지만, inode은 여전히 ​​스크립트가 완료되면., 카운터가 0이 될 존재하고 inode은 삭제되지.

디렉토리 엔트리에 의해 참조되지 아이 노드를 읽을 수있는 쉬운 방법은 없습니다.

+0

감사합니다. 이것은 이제 의미가 있습니다. – Bob

1

파일이 실제로 d가 아닙니다. 아무것도 언급 할 때까지 eleted. 이 경우 모든 디렉토리 항목을 삭제했지만 프로그램에 열려있는 파일 설명자가 있으므로 프로그램이 종료 될 때까지 데이터가 완전히 제거되지 않습니다. 디스크 공간을 계속 차지할 것입니다.

리눅스에서는 파일 내용을 /proc/PID/fd/FD으로 볼 수 있습니다. 여기서 PID는 프로세스의 ID이고 FD는 관심있는 파일 설명자입니다. 프로그램이 종료되면 데이터가 토스트되고 디스크 공간을 다시 확보 할 수 있습니다 ... 할 수있는 동안 데이터를 얻으십시오;)

프로그램에 아직 파일 설명자가 열려 있다는 것을 알고 있으면 로그 파일을 제거하지 마십시오. 대신 파일을 cat /dev/null > log.file으로 자르거나 bash에서 > log.file을 사용하십시오.

+0

'/ proc/PID/fd/FD /'가있는'/'가 아닌'home /'파티션에서 디스크 공간을 사용합니다 – Bob