Linux에서 프로그램을 실행하거나 파일을 덮어쓰는 과정에서 Text file busy 오류가 발생하는 경우가 있습니다. 이 오류는 현재 실행 중인 프로그램 파일을 수정하거나 삭제하려고 할 때 발생하는 대표적인 파일 잠금(File Lock) 관련 오류입니다.
운영 중인 서버에서는 배포 과정에서 새로운 바이너리로 교체하거나 쉘 스크립트를 수정하는 경우가 많은데, 해당 파일이 이미 실행 중이라면 Text file busy 오류가 발생할 수 있습니다. 특히 웹 서버, Java 애플리케이션, Shell Script, Docker 환경에서 자주 발생합니다.
이번 글에서는 Text file busy 오류가 발생하는 원인과 해결 방법을 실무 중심으로 알아보겠습니다.
Text file busy란 무엇인가?
Text file busy는 현재 실행 중인 실행 파일이나 스크립트를 수정하거나 덮어쓰려고 할 때 운영체제가 이를 차단하면서 발생하는 오류입니다.
대표적인 오류는 다음과 같습니다.
bash: ./app: Text file busy
또는
cannot execute: Text file busy
또는
Text file busy
이 오류는 실행 중인 파일의 무결성을 보호하기 위한 Linux 커널의 동작입니다.
Text file busy 오류가 발생하는 대표적인 원인
다음과 같은 경우에 자주 발생합니다.
- 실행 중인 바이너리 덮어쓰기
- 실행 중인 Shell Script 수정
- 배포 중 파일 교체
- NFS 파일 잠금 문제
- Docker Volume 충돌
- 파일 시스템 캐시 문제
- 프로세스가 파일을 점유 중
- 잘못된 배포 방식
- 여러 사용자가 동시에 수정
- 자동 업데이트 프로그램 충돌
실무에서는 어떤 프로세스가 파일을 사용 중인지 확인하는 것이 가장 중요합니다.
1. 파일을 사용하는 프로세스 확인하기
가장 먼저 해당 파일을 사용하는 프로세스를 확인합니다.
lsof 파일명
예시
lsof ./app
현재 어떤 프로세스가 파일을 점유하고 있는지 확인할 수 있습니다.
2. fuser 명령으로 확인하기
다음 명령도 자주 사용됩니다.
fuser 파일명
예시
fuser ./app
PID를 바로 확인할 수 있습니다.
3. 실행 중인 프로세스 확인하기
프로세스 목록을 확인합니다.
ps -ef | grep app
또는
pgrep app
해당 프로그램이 실행 중인지 확인합니다.
4. 프로세스 종료하기
프로세스를 정상 종료합니다.
kill PID
종료되지 않는다면
kill -9 PID
를 사용할 수 있지만, 서비스 운영 중에는 강제 종료 전에 영향 범위를 확인해야 합니다.
5. 파일 잠금 확인하기
파일 잠금 정보를 확인합니다.
lslocks
또는
cat /proc/locks
잠금 상태를 확인할 수 있습니다.
6. NFS 환경 확인하기
NFS를 사용하는 환경이라면 마운트 상태를 확인합니다.
mount | grep nfs
또는
df -h
NFS 파일 잠금 문제로 인해 오류가 발생할 수도 있습니다.
7. Docker 환경 확인하기
Docker에서는 Volume을 통해 파일을 공유하는 경우가 많습니다.
실행 중인 컨테이너를 확인합니다.
docker ps
Volume 설정을 확인합니다.
docker inspect 컨테이너명
Volume에서 파일이 사용 중인지 확인합니다.
8. 임시 파일을 이용한 배포
실무에서는 기존 파일을 직접 덮어쓰지 않고 새로운 파일을 생성한 뒤 이름만 변경하는 방식을 많이 사용합니다.
예시
cp app app.new
mv app.new app
또는 심볼릭 링크를 교체하는 방식이 서비스 중단을 최소화하는 데 효과적입니다.
9. 시스템 로그 확인하기
관련 로그를 확인합니다.
journalctl -xe
또는
dmesg
파일 시스템 오류나 권한 문제도 함께 확인합니다.
10. 서비스 재시작하기
서비스를 사용하는 경우에는 서비스를 중지한 후 파일을 교체하는 것이 안전합니다.
예시
systemctl stop nginx
파일 교체 후
systemctl start nginx
또는
systemctl restart nginx
를 실행합니다.
Text file busy 문제를 확인하는 순서
실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.
lsof확인fuser확인ps확인- 프로세스 종료 여부 확인
lslocks확인- NFS 확인
- Docker 확인
- 배포 방식 확인
- 시스템 로그 확인
- 서비스 재시작
이 순서대로 점검하면 대부분의 원인을 빠르게 찾을 수 있습니다.
오류를 예방하는 방법
Text file busy 오류를 예방하려면 실행 중인 파일을 직접 덮어쓰지 않는 것이 중요합니다.
운영 환경에서는 다음과 같은 배포 방식을 권장합니다.
- 새 파일 생성 후 이름 변경
- 심볼릭 링크 교체
- Blue-Green 배포
- Rolling Update
- 서비스 중지 후 파일 교체
이러한 방식은 서비스 중단을 최소화하면서 안전하게 배포할 수 있습니다.
자주 묻는 질문
파일을 수정하지도 않았는데 Text file busy가 발생합니다.
백그라운드 프로세스나 다른 사용자가 해당 파일을 사용 중일 수 있습니다. lsof와 fuser로 점유 상태를 먼저 확인해 보세요.
Docker에서도 발생할 수 있나요?
네. 컨테이너가 Volume을 통해 파일을 사용 중이라면 동일한 오류가 발생할 수 있습니다.
강제로 kill -9를 사용해도 되나요?
가능하지만 운영 환경에서는 데이터 손실이나 서비스 장애가 발생할 수 있으므로 먼저 정상 종료(kill)를 시도하는 것이 좋습니다.
마무리
Text file busy 오류는 Linux에서 실행 중인 파일을 보호하기 위해 발생하는 정상적인 동작입니다. lsof, fuser, ps, lslocks 등을 활용하면 어떤 프로세스가 파일을 점유하고 있는지 빠르게 확인할 수 있으며, 배포 시에는 파일을 직접 덮어쓰기보다 새 파일 생성 후 교체하는 방식을 사용하는 것이 안전합니다.