只有在使用原始文件时,fuser 才能向您显示。
如果 SYMLINK IS IN USE 调用原始文件,fuser 不会向您显示。这就是问题所在。您不知道符号链接是否未使用并且可以删除。
我已经启动了两个进程(24261 打开原始文件和 24262 打开符号链接):
root@server DEV # ls -l /lib64/libgcc_s-4.4.7-20120601.so.1
-rwxr-xr-x 1 root root 93320 Sep 1 2014 /lib64/libgcc_s-4.4.7-20120601.so.1
root@server DEV # ls -l /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
lrwxrwxrwx. 1 root root 20 Oct 19 2015 /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so -> /lib64/libgcc_s.so.1
root@server DEV #
root@server DEV # tail -f /lib64/libgcc_s.so.1 &
[1] 24261
root@server DEV #
root@server DEV # cd /usr/lib/gcc/x86_64-redhat-linux/4.4.4
root@server DEV # tail -f libgcc_s.so &
[2] 24262
root@server DEV #
root@server DEV # ps -ef | grep tail
root 24261 3265 0 13:39 pts/1 00:00:00 tail -f /lib64/libgcc_s.so.1
root 24262 3265 0 13:39 pts/1 00:00:00 tail -f libgcc_s.so
root 24492 3265 0 13:40 pts/1 00:00:00 grep tail
root@server DEV #
在这两种情况下,fuser 都会告诉符号链接和原始文件正在使用中(每个命令有两个进程):
root@server DEV # fuser /lib64/libgcc_s.so.1
/lib64/libgcc_s.so.1: 24261 24262
root@server DEV # fuser /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so: 24261 24262
root@server DEV #
但是我们知道第一个进程没有使用符号链接。它甚至可以被删除,不会影响第一个过程。
假设如果包未使用,我想删除“gcc”包。
原始文件来自“libgcc”包。
root@server DEV # rpm -qf /lib64/libgcc_s.so.1
libgcc-4.4.7-11.el6.x86_64
符号链接来自“gcc”包:
root@server DEV # rpm -qf /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
gcc-4.4.7-11.el6.x86_64
如果我要删除只包含符号链接的“gcc”包,我会影响第二个进程!如何查看符号链接是否未使用?
就我而言,“ps -ef”表明我使用了命令:
root 24262 3265 0 13:39 pts/1 00:00:00 tail -f libgcc_s.so
所以 ps 甚至不能告诉你使用了符号链接。
有 Linux 大师吗?
编辑:有部分解决方案检查 cwd - 当前工作目录:
root@server DEV # ls -l /proc/24262/cwd
lrwxrwxrwx 1 root root 0 Jun 20 13:57 /proc/24262/cwd -> /usr/lib/gcc/x86_64-redhat-linux/4.4.4
root@server DEV #
所以从这里你可以看到路径“/usr/lib/gcc/x86_64-redhat-linux/4.4.4”,你可以从 ps 获取文件名。
如果您这样做,这将不起作用:
root@server DEV # cd /root
root@server DEV # cat script.sh
/usr/bin/tail -f /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
root@server DEV #
root@server DEV # nohup ./script.sh &
[2] 26713
root@server DEV #
root@server DEV # ls -l /proc/26713/cwd
lrwxrwxrwx 1 root root 0 Jun 20 14:32 /proc/26713/cwd -> /root
它显示 /root 的 cwd,但符号链接在脚本/程序内。那么你需要检查 /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so 的 ps chill 进程。
root@server DEV # ps -ef | grep 26713
root 26713 3265 0 14:32 pts/1 00:00:00 /bin/sh ./script.sh
root 26714 26713 0 14:32 pts/1 00:00:00 /usr/bin/tail -f /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so
root 26780 3265 0 14:38 pts/1 00:00:00 grep 26713
root@server DEV #
当您想要自动删除包时(如果包未在使用中),这非常令人困惑。
如果有人能看到更简单的方法,那就太好了。此外,如果有人可以确认在使用检测中使用 cwd 和 ps 子进程进行符号链接的准确性。
如果 script.sh 是二进制文件会发生什么?我还能在“ps”或 cwd 中看到完整的符号链接路径吗?