Lsof

如何使用庫包檢測正在執行的程序?

  • January 29, 2015

此命令正在使用 glibc 循環檢測目前正在執行的程序:

lsof | grep libc | awk '{print $2}' | sort | uniq

我發現它非常煩人,因為/libc/不僅匹配libc,而且在我的系統上匹配:

/lib/x86_64-linux-gnu/libcap.so.2.24
/lib/x86_64-linux-gnu/libcgmanager.so.0.0.0
/lib/x86_64-linux-gnu/libcom_err.so.2.1
/lib/x86_64-linux-gnu/libcrypt-2.19.so
/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
/usr/lib/libcamel-1.2.so.45.0.0
/usr/lib/unity-settings-daemon-1.0/libcolor.so
/usr/lib/unity-settings-daemon-1.0/libcursor.so
/usr/lib/x86_64-linux-gnu/colord-plugins/libcd_plugin_camera.so
/usr/lib/x86_64-linux-gnu/colord-plugins/libcd_plugin_scanner.so
/usr/lib/x86_64-linux-gnu/gtk-3.0/modules/libcanberra-gtk3-module.so
/usr/lib/x86_64-linux-gnu/libcairo-gobject.so.2.11301.0
/usr/lib/x86_64-linux-gnu/libcairo.so.2.11301.0
/usr/lib/x86_64-linux-gnu/libcanberra-0.30/libcanberra-pulse.so
/usr/lib/x86_64-linux-gnu/libcanberra-gtk3.so.0.1.9
/usr/lib/x86_64-linux-gnu/libcanberra.so.0.2.5
/usr/lib/x86_64-linux-gnu/libcap-ng.so.0.0.0
/usr/lib/x86_64-linux-gnu/libck-connector.so.0.0.0
/usr/lib/x86_64-linux-gnu/libcolordprivate.so.1.0.23
/usr/lib/x86_64-linux-gnu/libcolord.so.1.0.23
/usr/lib/x86_64-linux-gnu/libcroco-0.6.so.3.0.1
/usr/lib/x86_64-linux-gnu/libcupsmime.so.1
/usr/lib/x86_64-linux-gnu/libcups.so.2
/usr/lib/x86_64-linux-gnu/samba/libcliauth.so.0
/usr/lib/x86_64-linux-gnu/samba/libcli_cldap.so.0
/usr/lib/x86_64-linux-gnu/samba/libcli-ldap-common.so.0
/usr/lib/x86_64-linux-gnu/samba/libcli-nbt.so.0
/usr/lib/x86_64-linux-gnu/samba/libcli_smb_common.so.0
/usr/lib/x86_64-linux-gnu/samba/libcli_spoolss.so.0
/usr/lib/x86_64-linux-gnu/samba/liblibcli_lsa3.so.0
/usr/lib/x86_64-linux-gnu/samba/liblibcli_netlogon3.so.0

我知道libc幾乎所有東西都使用它,但我想改進這個命令。考慮它在其他庫中的應用。我怎樣才能做到這一點?

在我看來,這種方法的缺陷在於,提供的包libc可能包含一大堆其他共享庫文件(所有這些文件可能包含也可能不包含在庫名稱的總稱下,例如glibclibboost-python)。使用單詞邊界或-標記結尾libc並不能真正解決這個問題。正如 Braiam 指出的那樣,這可能不是一個缺陷,因為許多或所有這些.so文件可能連結到存在缺陷的核心文件,就像libc6在 Debian 上的情況一樣。

如果需要特定的作業系統/發行版,假設 Debian Linux。

同樣令人討厭的是,這​​個命令可以被壓縮為lsof | awk '/libc/{print $2}' | sort -u.

這是一種迂迴且非常不准確的方法。你知道庫文件的位置,所以你不需要使用啟發式來匹配它,你可以搜尋確切的路徑。

有一種非常簡單的方法可以列出打開文件的程序:

fuser /lib/x86_64-linux-gnu/libc.so.6

然而,這列出了打開文件的目前版本的程序,即使用庫的新副本的程序。如果要列出具有已刪除副本的程序,可以使用lsof,但要搜尋確切路徑。限制lsof包含已刪除文件的文件系統以提高性能(並可能避免阻塞例如暫時無法訪問的網路文件系統)。

lsof -o / | awk '$4 == "DEL" && $8 == "/lib/x86_64-linux-gnu/libc-2.13.so" {print $2}'

如果升級的包包含多個庫並且您想要檢測任何庫,請列出包中的所有庫文件。這是一種以程式方式執行此操作的方法(對於 Debian 軟體包,請根據您的發行版進行調整,例如rpm -ql glibc在 Red Hat 上)。

lsof -o / | awk '
  BEGIN {
      while (("dpkg -L libc6:amd64 | grep \\\\.so\\$" | getline) > 0)
          libs[$0] = 1
  }
  $4 == "DEL" && $8 in libs {print $2}'

引用自:https://unix.stackexchange.com/questions/181697