linux中如何查看某个文件被哪些进程占用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中如何查看某个文件被哪些进程占用相关的知识,希望对你有一定的参考价值。

如题,例如,在/home/dev下有个文件叫1.txt。我发现我无法删除这个文件,提示"file busy"。所以我想查看这个文件是不是有其他进程在使用中,应该如何查看?(ps??)

查看进程

在Linux要检查那一个进程(process)占用特定埠号,可以用netstat或lsof来做,例如想列出所有开启的埠号,可以netstat指令:

假如只想输出某个文件的进程,可以加上grep过滤:

或者只想输出占用某个端口的进程,可以加上grep过滤:

上面可以看到是mongod占用端口966,进程的pid是966

杀死进程

通常有两个命令来结束进程:

    kill - 通过进程 ID 来结束进程

    killall - 通过进程名字来结束进程

我们现在用 kill 命令来杀死 mongod的进程。这个命令的结构是:kill SIGNAL PID

或者:

我们已经知道我们想要杀死的那个进程的名字,我们能够利用 killall 命令发送同样的信号,像这样:

killall -9 mongod

参考技术A linux系统下查看进程打开文件
在/proc下,对应每个进程有一个以进程号命名的目录,该目录下有一个fd目录,该目录下面的每个文件是一个符号连接,其文件名对应该进程占用的一个文件描述符,而连接指向的内容表示文件描述符对应的实际文件,有多少个文件描述符表示该进程打开了多少文件。
另外Linux
默认的进程打开文件上限是1024个,可以通过ulimit
-n查看。很多系统上限可以通过修改/etc/security/limits.conf文件改变,这个文件有详细的注释,对如何修改做了说明。如果希望
把所有用户的进程打开文件上限改为65536,可以加入下面两行

* soft nofile 65535
* hard nofile 65535

还可以只真对某个用户或某个组做修改,具体方法参见文件注释。修改后需要重新启动系统才能生效。
参考技术B 1.只查看该进程:ps -ef | grep 11345
2.查看该进程打开的文件:lsof -p 11345
3.查看内存分配:lcat /proc/11345/maps
4.查看堆栈:pstack 11345
5.查看发出的系统调用:strace -p 11345
6.查看调用库函数:ltrace -p 11345
参考技术C 可以使用ps -fe|grep filename,也可以使用fuser filename查看本回答被提问者采纳

Linux运维之如何查看目录被哪些进程所占用,lsof命令

之前将一块硬盘挂载到某个目录下,但是现在我想卸载掉这块硬盘,无论如何都umount不了,有些同学可能说需要加上 -f 参数强制卸载,理论上是可以的,但是在我这里依然不起作用,比如:

[[email protected]:vg_adn_clickhouseTest_1ubuntu:: ~]#umount -f /data2
umount: /data2: target is busy.

我是把一块2T的硬盘挂载到/data2目录下了,可是现在就是卸载不了,说是设备忙,仔细分析一下可以得出应该是某些应用程序的进程占用了这块分区/data2 。应用程序一直在跑着,所以我们无法卸载这块硬盘。解决的方法就是找出哪个进程在占用这块硬盘。那我们知道一块硬盘一般上都是关联至某一个目录下的。所以我们就去找这个目录被哪些进程所占用。使用命令 lsof 即可

[[email protected]:vg_adn_clickhouseTest_2ubuntu:172.31.19.193 ~]#lsof /data2
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
clickhous 31721 clickhouse    7wW  REG  253,0       59 45088774 /data2/clickhouse/status
[[email protected]:vg_adn_clickhouseTest_2ubuntu:172.31.19.193 ~]#kill -9 31721
[[email protected]:vg_adn_clickhouseTest_2ubuntu:172.31.19.193 ~]#service clickhouse-server status
● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
   Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: signal) since Wed 2019-01-16 10:51:32 UTC; 11s ago
  Process: 31721 ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml (code=killed, signal=KILL)
  Process: 31715 ExecStartPre=/bin/chown clickhouse:clickhouse -R /etc/clickhouse-server (code=exited, status=0/SUCCESS)
  Process: 31713 ExecStartPre=/usr/bin/chown clickhouse:clickhouse -R /etc/clickhouse-server (code=exited, status=0/SUCCESS)
 Main PID: 31721 (code=killed, signal=KILL)

Jan 16 10:51:32 ip-172-31-19-193 systemd[1]: clickhouse-server.service: Failed with result signal.

现在我们找到原来是clickhouse程序再占用这块磁盘,因此我们卸载不了。事实上,lsof命令后面也可以跟上lvm的名字也是可以查出来的。

以上是关于linux中如何查看某个文件被哪些进程占用的主要内容,如果未能解决你的问题,请参考以下文章

Linux如何查询哪些端口被占用

Linux如何查询哪些端口被占用

Linux如何查询哪些端口被占用

Linux运维之如何查看目录被哪些进程所占用,lsof命令

linux如何查看内存被哪些进程占用

Linux下如何查看哪些端口处于监听状态