Watch at Ease세상을 읽고, 일상의 답을 찾다.

Technology · 실용 가이드

Linux “Text file busy”? 실행 파일을 바꾸기 전에 소유자를 증명하세요

ETXTBSY는 chmod 문제가 아니라 쓰기와 실행의 충돌입니다. 경로와 inode, 실행자와 쓰기자를 기록하고 별도 후보를 검증한 뒤 경로 전환과 서비스 재시작을 각각 확인합니다.

원본 기술 일러스트: Linux “Text file busy”? 실행 파일을 바꾸기 전에 소유자를 증명하세요 — path and inode evidence
원본 기술 일러스트: 변경 전에 경로, 해석 경로, 장치, inode, 모드, 소유자, 해시와 관련 프로세스를 기록합니다. Watch at Ease

Linux의 “Text file busy”(ETXTBSY)는 실행 중인 이미지에 쓰려고 하거나, 다른 프로세스가 아직 쓰기 상태로 연 파일을 실행하려 할 때 주로 발생합니다. 무조건 재시도하거나 chmod, 제자리 복사를 하면 소유권 충돌을 숨길 수 있습니다.

정확한 경로, 장치와 inode를 보존하고 실행 프로세스와 쓰기 가능한 설명자를 찾습니다. 별도 후보를 검증해 같은 파일시스템에서 한 경로를 바꿔도 기존 프로세스는 옛 이미지를 계속 사용합니다. 재시작과 수락 검증은 별도 단계입니다.

ETXTBSY를 chmod 문제로 보지 마세요

이 오류는 쓰기와 실행 관계를 말하며 실행 비트 부족을 뜻하지 않습니다. 실패 명령과 errno를 보존하고, 배포기가 실행 중 바이너리를 덮는 경우와 새 파일의 쓰기 설명자가 상속된 경우를 구분합니다.

메시지를 없애려고 운영 바이너리를 삭제하거나 강제 복사, 반복 재시도하지 마세요. 목적이 제자리 쓰기, 새 실행, 통제된 교체 중 무엇인지 먼저 정합니다.

경로, inode와 두 소유자를 증명하세요

readlink, stat, file, sha256sum으로 대상 정체성을 기록하고 승인된 프로세스 목록, fuser 또는 lsof로 실행자와 쓰기자를 찾습니다. rename 뒤에는 같은 경로가 다른 inode를 가리킬 수 있습니다.

systemd, 컨테이너, 감독자 또는 패키지 관리자 같은 수명주기 소유자도 기록합니다. NFS, 공유 폴더와 overlay 저장소는 별도 경계입니다.

실행 이미지 충돌과 쓰기 설명자 경쟁을 분리하세요

첫 경우는 옛 프로세스가 재작성 대상 inode를 실행하는 것입니다. 둘째는 fork가 새 실행 파일의 쓰기 설명자를 상속해 execve가 여전히 쓰기 중으로 보는 경우입니다. Rust 이슈가 둘째 경쟁을 재현합니다.

sleep과 재시도는 타이밍만 바꿉니다. 설명자 소유권과 쓰기-실행 인계를 명시하거나, 별도 후보를 배포 소유자가 전환해야 합니다.

별도 후보를 준비하고 한 경로만 의도적으로 전환하세요

대상 디렉터리나 같은 파일시스템의 검증 위치에 후보를 쓰고 해시, 형식, 모드, 소유자와 필요한 서명을 확인합니다. 전송 해시만 맞는다고 신뢰하지 않은 파일을 실행하지 않습니다.

rename(2)의 원자적 교체는 한 디렉터리 항목에만 적용되고 기존 설명자에는 영향을 주지 않습니다. 여러 파일, 네트워크 저장소, 라이브러리와 마이그레이션은 별도 거래와 롤백이 필요합니다.

재시작하고 검증한 뒤 사건을 종료하세요

전환 후 기존 프로세스는 옛 inode를 계속 사용할 수 있습니다. 서비스 소유자가 재시작한 뒤 새 PID, 정체성, 버전, 상태, 로그와 종속성을 확인합니다.

원래 ETXTBSY가 설명되고 예상 밖 쓰기 설명자가 사라지며 새 실행이 의도한 파일을 쓰고 실제 수락 시험이 통과할 때만 종료합니다.

원본 기술 일러스트: Linux “Text file busy”? 실행 파일을 바꾸기 전에 소유자를 증명하세요 — replacement and restart boundary
원본 기술 일러스트: 전환 후 새 PID, 실행 파일 정체성, 버전, 상태, 로그와 롤백 준비를 검증합니다. Watch at Ease