리눅스2023. 8. 1. 11:45

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/597979 (2017.5.10)

"list open files"를 의미하는 lsof 명령은 현재 열려 있는 파일의 목록을 출력해 준다. 어떤 명령어에 의해 어떤 파일이 열려 있고, 해당 명령어에 대응되는 프로세스ID(PID), 사용자 등을 확인할 수 있다.

# 모든 열린 파일 목록 출력
lsof

만약 특정 사용자에 의해 열린 모든 파일을 보고 싶다면 아래의 예시처럼 -u 옵션을 사용한다.

# 사용자 john에 의해 열린 파일 목록 출력
lsof -u john

2개 이상의 사용자를 지정하고 싶을 경우에는 쉼표(,)로 구분한다.

# 사용자 root와 john에 의해 열린 파일 목록 출력
lsof -u root,john

개인적으로 가장 요긴하게 사용하는 경우는 특정 디렉토리에 연결된 저장장치를 해제(언마운트, unmount)하려는데 어딘가 파일이 열려 있어서 "device is busy"라고 오류 메시지가 나올 때다. grep 명령과 조합하면 어느 사용자가 어느 파일을 열고 있어서 장치를 붙잡았는지 쉽게 확인할 수 있다.

예를 들어 /home/john/my_nfs_dir/ 디렉토리에 원격에 있는 저장공간을 NFS로 연결해서 사용하다가 이걸 umount 명령으로 해제하는 경우를 생각해 보자.

# NFS 연결 해제 시도
sudo umount /home/john/my_nfs_dir/
umount.nfs: /home/john/my_nfs_dir/: device is busy

위와 같이 "device is busy" 메시지가 나왔을 경우, lsof를 이용해서 열린 파일 목록을 출력하고 grep으로 해당 디렉토리에 속한 파일들만 추려내면 된다.

# /home/john/my_nfs_dir 하위에 열려 있는 파일 목록 확인
lsof | grep "/home/john/my_nfs_dir"

DVD롬이나 USB메모리를 장착하고 작업하다가 언마운트할 때도 마찬가지. 배포판마다 마운트되는 디렉토리가 다를 수 있는데, 예를 들어 /media 디렉토리 하위에 연결되어 있다면 아래와 같이 확인할 수 있다.

# /media 하위에 열려 있는 파일 목록 확인
lsof | grep "/media"

터미널창을 수십개 열어 놓고 작업하면서 과거에 뭔가 하다가 잊어버리고 방치해 놓았을 경우에 손쉽게 찾아서 정리할 수 있어 편리하다.

728x90
Posted by 반달가면