2016-06-20 60 views
1

只有當原始文件正在使用時,熱凝器才能向您顯示。如何檢查Linux符號鏈接是否正在使用? (去除未使用的符號鏈接)

定影器如果SYMLINK在使用中,則不會顯示您調用原始文件。這是問題。你不知道符號鏈接是否被使用,並且可以被刪除。

我已經開始兩個過程(24261打開原始文件和24262打開符號鏈接):

[email protected] 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 
[email protected] 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 
[email protected] DEV # 
[email protected] DEV # tail -f /lib64/libgcc_s.so.1 & 
[1] 24261 
[email protected] DEV # 
[email protected] DEV # cd /usr/lib/gcc/x86_64-redhat-linux/4.4.4 
[email protected] DEV # tail -f libgcc_s.so & 
[2] 24262 
[email protected] DEV # 
[email protected] 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 
[email protected] DEV # 

在這兩種情況下,定影告訴符號鏈接和原始文件正在使用(有每個命令的兩個過程):

[email protected] DEV # fuser /lib64/libgcc_s.so.1 
/lib64/libgcc_s.so.1: 24261 24262 
[email protected] 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 
[email protected] DEV # 

但是我們知道符號鏈接沒有用於第一個進程。它甚至可以被移除,不會影響第一個過程。

比方說,如果軟件包未被使用,我想刪除'gcc'軟件包。

原始文件來自'libgcc'包。

[email protected] DEV # rpm -qf /lib64/libgcc_s.so.1 
libgcc-4.4.7-11.el6.x86_64 

符號連接來自 'GCC' 包:

[email protected] DEV # rpm -qf /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so 
gcc-4.4.7-11.el6.x86_64 

如果我將刪除 '海灣合作委員會' 包,其中只包含符號鏈接,我會影響到第二個進程!如何查看符號鏈接是否未被使用?

在我的情況「PS -ef」顯示,我用命令:

root  24262 3265 0 13:39 pts/1 00:00:00 tail -f libgcc_s.so 

所以PS甚至不能告訴你的是使用符號鏈接。

任何Linux專家?

編輯: 還有就是部分解決檢查CWD - 當前工作目錄:

[email protected] 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 
[email protected] DEV # 

所以,從這裏,你看到的路徑 「/usr/lib/gcc/x86_64-redhat-linux/4.4.4」你可以從ps獲得文件名。

如果你這樣做不行:

[email protected] DEV # cd /root 
[email protected] DEV # cat script.sh 
/usr/bin/tail -f /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so 
[email protected] DEV # 
[email protected] DEV # nohup ./script.sh & 
[2] 26713 
[email protected] DEV # 
[email protected] DEV # ls -l /proc/26713/cwd 
lrwxrwxrwx 1 root root 0 Jun 20 14:32 /proc/26713/cwd -> /root 

它顯示/根CWD,但符號連接是腳本/程序中。那麼你需要檢查/ psr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc_s.so的ps chill進程。

[email protected] 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 
[email protected] DEV # 

當您想自動移除包裹(如果包裹未被使用)時,這會非常混亂。

如果有人能看到更簡單的方法,那將會很棒。另外,如果有人可以確認使用cwd和ps子進程進行符號鏈接使用檢測的準確性。

如果script.sh會是二進制文件會發生什麼?我仍然能夠在'ps'或cwd中看到完整的符號鏈接路徑嗎?

+0

爲什麼你需要刪除未使用的符號鏈接? – Thilo

+0

我需要刪除未使用的編譯器(例如gcc)。這是出於安全目的。 –

+1

「未使用的編譯器」和符號鏈接之間的關係是什麼? – hymie

回答

0

不幸的是,Linux內核被設計爲在啓動階段從符號鏈接分配原始文件。所以當進程運行時,不可能檢查直接或通過符號鏈接調用的文件。

所有你可以做的是檢查什麼是當前的工作目錄ls -l /proc/<process_id>/cwd,命令行參數strings /proc/<process_id>/cmdline,哪些用戶開始ps -ef | grep <process_id>那麼你可以檢查用戶啓動腳本和$PATHldd可以告訴你的過程,庫來源於特定的庫調用。如果你想重新啓動進程來查看是否有符號鏈接,那麼strace是你的朋友。

1

如果通過「正在使用」您的意思是「一個或多個程序正在使用該鏈接作爲其文件的路徑名稱」,則無法分辨。它本可以在昨天使用,明天可能會使用它。 Unix的設計是這樣的,除非你專門使用爲特定目的而設計的工具,否則符號鏈接看起來就像它指向的文件。像fuserlsof這樣的程序只會通過鏈接進入,甚至不會告訴你它是一個鏈接。

如果通過「正在使用」您的意思是「指向有效文件」,那麼有辦法告訴。最簡單的是ls -L

$ ls -l foo 
/bin/ls: cannot access foo: No such file or directory 
$ ls -l g 
lrwxrwxrwx 1 hymie users 3 2016-06-20 10:09 g -> foo 
$ ls -lL g 
/bin/ls: cannot access g: No such file or directory 
+0

這是Unix/Linux無法輕易告訴你有關符號鏈接的問題,如果它現在正在使用。如果這個過程是昨天或短暫的,或者等等,那麼就有一個解決方案「審計」工具。 –

2

符號鏈接不通常文件:他們不能像普通的文件或目錄與open()打開。符號鏈接實際上只是一個常量字符串,在路徑解析期間會自動解釋它。

由於這種符號鏈接在諸如fuser等實用工具中並未「使用」。當你爲符號鏈接調用熱熔器時,它實際上顯示關於鏈接指向的文件的信息。

0

這個問題(識別與fuser/lsof未使用的包)的前提是根本性的缺陷:

不是每個文件系統需要通過一個開放的文件描述符在任何隨機的時間才能正常工作會引用。

例如,如果您刪除了/bin/systemctl(因爲/sbin/shutdown是符號鏈接),但lsof不會顯示任何內容。

很容易想出更多的例子,例如我的系統上的/bin/grep。它在shell腳本中被廣泛使用,但是我沒有碰到它的任何長時間運行的實例。