저는 꽤 복잡한 파이썬 프로그램이 있습니다. 내부적으로는 독점적 인 (LOCK_EX) fcntl.flock을 사용하여 글로벌 잠금을 관리하는 로깅 시스템이 있습니다. 효과적으로 로그 메시지가 덤프 될 때마다 전역 파일 잠금이 획득되고 메시지가 파일 (잠금 파일과 다름)로 내보내지고 전역 파일 잠금이 해제됩니다.플록, 포크 및 종료 부모 프로세스로 교착 상태가 발생했습니다.
프로그램도 로그 관리가 설정된 후 여러 번 분기합니다. 일반적으로 모든 것이 작동합니다.
부모 프로세스가 종료되고 (자식 프로세스가 살아있을 경우) 때때로 교착 상태가 발생합니다. 모든 프로그램은 fcntl.flock()에서 영원히 차단됩니다. 자물쇠를 외부에서 얻으려고하면 영원히 차단됩니다. 나는 문제를 해결하기 위해 어린이 프로그램을 죽여야 만한다.
lsof lock_file은 잠금을 유지하는 프로세스가 없음을 나타냅니다. 그래서 파일이 커널에 의해 잠겨있는 이유를 알 수는 없지만 그것을 유지하는 것으로보고 된 프로세스는 없습니다.
무리가 분기에 문제가 있습니까? 죽은 부모는 프로세스 테이블에 더 이상 없어도 잠금을 유지하고 있습니까? 이 문제를 해결하려면 어떻게해야합니까?
좋아요. fcntl.lockf로 전환하여 fcntl 잠금 (flock이 아닌)을 래핑했습니다. 교착 상태가 사라졌습니다. – UsAaR33
fcntl이 inode/pid를 사용하여 잠금을 설정하는 동안 flock이 파일 설명 자 (자식 프로세스에서 여전히 종료 됨)를 잠그기 때문에 이것이 의심스러운 경우입니다. 이상한 것은 비록 아이들이 무리를 효과적으로 소유하고 있다고 해석하지 못한다는 것입니다. 왜 그런가요? – UsAaR33