【发布时间】:2016-06-20 13:18:31
【问题描述】:
仅当原始文件正在使用中时,fuser 才能向您显示。
如果调用原始文件的 SYMLINK 正在使用中,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 中看到完整的符号链接路径吗?
【问题讨论】:
-
为什么需要删除未使用的符号链接?
-
我需要删除未使用的编译器(例如 gcc)。这是出于安全目的。
-
“未使用的编译器”和符号链接有什么关系?
-
这些在同一个包中。例如:
root@server DEV # rpm -ql gcc | grep -e '/usr/bin/gcc' -e '/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so' /usr/bin/gcc /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so -
所以现在我很困惑。你担心,如果你删除 gcc 包,那么没有人可以使用它吗?
标签: linux kernel ps lsof fuser