fuser命令可以显示使用文件系统或文件的PID.
##################################################
试验前先建立环境:
mount /dev/sdb1 /mnt/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
{
int fd;
fd = open("/mnt/temp", O_WRONLY|O_SYNC|O_CREAT);
lseek(fd, 80L, SEEK_SET);
sleep(100);
close(fd);
}
gcc test.c -o test
c current directory.
e executable being run.
f open file. f is omitted in default display mode.
F open file for writing. F is omitted in default display mode.
r root directory.
m mmap'ed file or shared library.
/mnt/test
fuser -v /mnt/test
USER PID ACCESS COMMAND
/mnt/test: root 2466 ...e. test
注:fuser -v列出/mnt/test程序在运行,同时输出它的PID为2466,ACCESS为e说明它是以一个可执行程序运行的.
##################################################
less /mnt/test.c
fuser -v /mnt/test.c
USER PID ACCESS COMMAND
/mnt/test.c: root 10546 f.... less
##################################################
测试3)用fuser显示被可写方式打开的文件,测试ACCESS为F位的情况(open file for writing. F is omitted in default display mode.)
vi /mnt/test.c
fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 10488 ..c.. bash
root 10625 F.... vi
另外如果用fuser -v /mnt/test.c将看不到输出,因为vi打开的文件实际是/mnt/.test.c.swp,在存盘时才会写到test.c中.
我们也可以用cat > /mnt/test.c的方式进行测试.
##################################################
测试4)用fuser显示的目录是否是用户的当前目录(current directory.)
cd /mnt/
fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 3486 ..c.. bash
root 10488 ..c.. bash
##################################################
测试5)用fuser显示的目录是否是根目录(root directory)
切换到普通用户test,并进入到/tmp目录
su - test
cd /tmp
fuser -vm /tmp
USER PID ACCESS COMMAND
/tmp: root kernel mount /
test 11274 .rce. bash
如果用普通用户test,由于权限的原因,这里只输出了自己的进程.
ACCESS为r说明这个进程用到的目录或文件是根目录下的.如果我们用fuser -vm /mnt/则看不到ACCESS为r的输出,因为它是单独的挂载.
这里我们假设/tmp是根分区系统下的目录,而不是单独的分区.
##################################################
测试6)用fuser显示mmap的文件或是共享lib库的文件的使用信息.(mmap'ed file or shared library.)
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
main (int argc, char *argv[])
{
const int nbytes = 4096;
void *ptr;
if (fd == -1) ERROR("open");
ptr = mmap(0, nbytes, PROT_READ|PROT_WRITE,MAP_PRIVATE, fd, 0);
if (ptr == MAP_FAILED) ERROR("mmap");
sleep(100);
munmap(ptr, nbytes);
}
运行/mnt/teset2
/mnt/test2
终端2)
fuser -v /mnt/test2.dat
USER PID ACCESS COMMAND
/mnt/test2.dat: root 11525 F...m test2
fuser -v /lib/libc.so.6
可以看到用到libc.so.6共享库的进程.
测试7)我们这里用两个简单的用例来做为本文的结束
同时也可以指定kill发送的信号,例如:
fuser -kvim -HUP /mnt/
USER PID ACCESS COMMAND
/mnt/: root kernel mount /mnt
root 3486 ..c.. bash
Kill process 3486 ? (y/N) y