linux删除目录报错和端口已占用时如何定位已占用的进程

遇到的问题

在我准备rm -rf ./hugo_blog_temp 删除一个目录时候
他提示

1
rm: cannot remove './hugo_blog_temp/.git/objects/pack/.nfs0000000000019b0d00000004': Device or resource busy

显然是有进程占用了,那么如何定位是什么进程占用并kill这个进程呢?

使用 lsof 查找进程

1
2
3
4
5
# 定位正在使用该目录的进程
lsof +D ./hugo_blog_temp

# 或者直接指定被锁定的文件
lsof ./hugo_blog_temp/.git/objects/pack/.nfs0000000000019b0d00000004

然后就会得到类似:

1
2
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
git 1234 user cwd DIR 0,46 4096 123456 /path/to/hugo_blog_temp

可以用来找占用的端口:

1
lsof -i:443

得到类似:

1
2
3
COMMAND     PID  USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
caddy 1103090 caddy 6u IPv6 153681762 0t0 TCP *:https (LISTEN)
caddy 1103090 caddy 8u IPv6 153681763 0t0 UDP *:https

终止进程:

1
kill -9 1234  # 将 1234 替换为实际 PID

这样即可结束掉占用进程,这个时候就可以rm -rf ./hugo_blog_temp

其他方法

使用 fuser 查找进程

1
2
3
4
5
# 查看占用文件的进程 PID
fuser -v ./hugo_blog_temp/.git/objects/pack/.nfs0000000000019b0d00000004

# 终止所有占用该文件的进程
fuser -k ./hugo_blog_temp/.git/objects/pack/.nfs0000000000019b0d00000004