linux fuser 사용법 - 파일이나 socket 을 어떤 프로세스가 사용중인지 확인
fuser 는 파일이나 소켓을 어떤 프로세스가 사용하는 지 알려주는 명령어입니다.
umount 를 하려는 데 "device is busy" 같은 에러 메시지가 난다면 특정 프로세스가 umount 하려는 파티션의 파일을 사용하고 있어서입니다.
fuser 는 이런 경우 해당 파티션의 파일을 사용하는 프로세스를 찾는 데 유용하게 사용할 수 있습니다.
fuser 대신 lsof 를 사용해도 됩니다.
fuser 를 옵션없이 파일이나 디렉터리만 전달하면 해당 리소스를 사용하는 프로세스 ID 를 출력합니다.
$ sudo fuser /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock : 20309
뒤에 보이는 20309 는 mysql.sock 을 사용하는 프로세스 ID 입니다.
-v, --verbose 를 붙이면 더 자세한 프로세스 정보를 출력합니다.
$ sudo fuser -v /var/lib/mysql/mysql.sock USER PID ACCESS COMMAND /var/lib/mysql/mysql.sock: mysql 20309 F.... mysqld
lsof 를 사용해도 원하는 결과를 얻을 수 있습니다.
$ sudo lsof /var/lib/mysql/mysql.sock COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 20309 mysql 26u unix 0xffff88803f457400 0t0 206420644 /var/lib/mysql/mysql.sock
namespace 사용
-n, --namespace 옵션을 사용하면 네임스페이스(file, udp, tcp) 안에서 프로세스를 찾게 됩니다. 다음은 MySql 의 기본 포트인 3306 을 사용하는 프로세스를 찾는 명령입니다.
$ sudo fuser -n tcp 3306 3306/tcp: 20309
80 과 443 포트를 사용하는 프로세스를 찾으려면 포트를 모두 기술해 줍니다.
$ sudo fuser -n tcp 80 443 80/tcp: 3268 3269 3270 3271 3272 443/tcp: 3268 3269 3270 3271 3272
프로세스의 정보를 더 자세히 알고 싶으면 -v 옵션을 추가합니다.
$ sudo fuser -n tcp -v 80 443 USER PID ACCESS COMMAND 80/tcp: root 3268 F.... nginx nginx 3269 F.... nginx nginx 3270 F.... nginx nginx 3271 F.... nginx nginx 3272 F.... nginx 443/tcp: root 3268 F.... nginx nginx 3269 F.... nginx nginx 3270 F.... nginx nginx 3271 F.... nginx nginx 3272 F.... nginx
mount 파일 시스템 사용 프로세스 찾기
-m, --mount 옵션을 사용하면 특정 파일 시스템을 사용하는 모든 프로세스를 찾아 줍니다. 예로 다음 명령어는 /var 를 사용하는 모든 프로세스의 정보를 표시합니다.
-m 옵션은 umount 하려는 데 "device is busy" 에러가 날 때 해당 파일 시스템을 사용하는 프로세스를 찾을 때 매우 유용합니다.
$ sudo fuser -v -m /var/
kill signal 보내기
-k,–kill 옵션을 사용하면 특정 파일이나 디렉터리를 사용하는 모든 프로세스에게 SIGKILL 을 전송할 수 있습니다. 예로 다음 명령어는 /var 를 사용하는 모든 프로세스에게 KILL signal 을 전송합니다.
$ sudo fuser -v -k /var/
프로세스를 종료할 때 SIGKILL 을 전송하는 것은 좋은 방법이 아니므로 -k 옵션을 사용하지 않는 것이 좋습니다.