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

阅读次数:

遇到的问题

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

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

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

使用 lsof 查找进程

# 定位正在使用该目录的进程
lsof +D ./hugo_blog_temp

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

然后就会得到类似:

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

可以用来找占用的端口:

lsof -i:443

得到类似:

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 

终止进程:

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

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

其他方法

使用 fuser 查找进程

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

# 终止所有占用该文件的进程
fuser -k ./hugo_blog_temp/.git/objects/pack/.nfs0000000000019b0d00000004
|
Built with Hugo
Theme Stack designed by Jimmy Customized and extended by Winotmk