프로세스가 종료되면 파이썬에서 파일 객체는 어떻게됩니까? Python이 SIGTERM
, SIGKILL
, SIGHUP
(등) 또는 KeyboardInterrupt
예외로 종료되는지 여부가 중요합니까?프로세스가 종료되면 파일 객체는 어떻게 파이썬에서 정리됩니까?
데이터를 지속적으로 수집하여 파일에 기록하는 일부 로깅 스크립트가 있습니다. 추가 정리 작업은 신경 쓰지 않지만 Python이 갑자기 종료되면 로그 파일이 손상되지 않도록하고 싶습니다 (예 : 백그라운드로 실행하고 컴퓨터를 종료 할 수 있음).
termtest.sh
:
for i in $(seq 1 10); do
python termtest.py $i & export pypid=$!
sleep 0.3
echo $pypid
kill -SIGTERM $pypid
done
termtest.py
: 나는 어떻게되는지하려고 다음 테스트 스크립트를 만들어
SIGINT
,
SIGHUP
에
SIGTERM
을 변경 다른 신호 (과
termtest.sh
를 실행
import csv
import os
import signal
import sys
end_loop = False
def handle_interrupt(*args):
global end_loop
end_loop = True
signal.signal(signal.SIGINT, handle_interrupt)
with open('test' + str(sys.argv[-1]) + '.txt', 'w') as csvfile:
writer = csv.writer(csvfile)
for idx in range(int(1e7)):
writer.writerow((idx, 'a' * 60000))
csvfile.flush()
os.fsync(csvfile.fileno())
if end_loop:
break
하고, SIGKILL
in termtest.sh
) (참고 :에 대한 명시적인 처리기는 termtest.py
입니다. 10 파이썬은 Ctrl+C
이 아닌 것을 처리하지 않기 때문에). 모든 경우에 모든 출력 파일에는 전체 행 (부분 쓰기 없음) 만 있었으며 손상된 것으로 나타나지 않았습니다. 나는 flush()
과 fsync()
을 호출하여 데이터가 가능한 한 많이 디스크에 쓰여지고 있는지 확인하여 스크립트가 중간 쓰기가 중단 될 가능성이 가장 큽니다.
파이썬이 종료되고 중간 상태의 파일을 남기지 않을 때 항상 파이썬이 쓰기를 완료한다고 결론 지을 수 있습니까? 또는 이것은 운영 체제 및 파일 시스템 (Linux 및 ext4 파티션으로 테스트 중이 었습니다)에 따라 좌우됩니까?