問題点
- 「yum-plugin-ps-1.1.31-40.29(現時点で最新)」をインストール
- 環境によってコマンド「yum ps」、「yum ps all」の結果がおかしい
- 特定の常駐プロセスに関するパッケージが表示されない(cron、ntpd等)
- 表示されているプロセスに関しても共有ライブラリに関連するパッケージが表示されていない
- 手持ちの物理マシンやVirtualBoxにインストールした環境では正常に結果が出る。試した中で発生したのはAWS EC2上、IDCF上で動作しているインスタンスの場合のみ?仮想環境が関係?
- 試したOSはAmazonLinux、RedHat、CentOS、かつバージョン関係なくどれでも発生する。
調査
該当メソッド
rpmdb_return_running_packages
get_open_files(pid)
-
https://github.com/rpm-software-management/yum/blob/7d568942ea14b109c9a5578de96fb1364f427f18/yum/misc.py#L1046
- /proc/%s/mapsの中身を解析
- 「/」がついてる行を抜き出して、6カラム目を取りだしてる
[root@localhost ~]# cat /proc/979/maps
55c2bbf2a000-55c2bbff2000 r-xp 00000000 fd:00 35048846 /usr/sbin/sshd
55c2bc1f1000-55c2bc1f5000 r--p 000c7000 fd:00 35048846 /usr/sbin/sshd
55c2bc1f5000-55c2bc1f6000 rw-p 000cb000 fd:00 35048846 /usr/sbin/sshd
55c2bc1f6000-55c2bc1ff000 rw-p 00000000 00:00 0
55c2be112000-55c2be133000 rw-p 00000000 00:00 0 [heap]
7ff2c8761000-7ff2c876d000 r-xp 00000000 fd:00 33605543 /usr/lib64/libnss_files-2.17.so
7ff2c876d000-7ff2c896c000 ---p 0000c000 fd:00 33605543 /usr/lib64/libnss_files-2.17.so
7ff2c896c000-7ff2c896d000 r--p 0000b000 fd:00 33605543 /usr/lib64/libnss_files-2.17.so
7ff2c896d000-7ff2c896e000 rw-p 0000c000 fd:00 33605543 /usr/lib64/libnss_files-2.17.so
7ff2c896e000-7ff2c8974000 rw-p 00000000 00:00 0
7ff2c8974000-7ff2c8983000 r-xp 00000000 fd:00 33625864 /usr/lib64/libbz2.so.1.0.6
-
https://github.com/rpm-software-management/yum/blob/7d568942ea14b109c9a5578de96fb1364f427f18/yum/misc.py#L1056
- デバイスを「fd:」で絞っているが、「fd:」になるとは限らない。
AWS上のインスタンス
# cat /proc/2475/maps
↓★★★↓
564e59cd2000-564e59d98000 r-xp 00000000 ca:01 12567 /usr/sbin/sshd
564e59f97000-564e59f9b000 r--p 000c5000 ca:01 12567 /usr/sbin/sshd
564e59f9b000-564e59f9c000 rw-p 000c9000 ca:01 12567 /usr/sbin/sshd
564e59f9c000-564e59fa5000 rw-p 00000000 00:00 0
564e5a45c000-564e5a47d000 rw-p 00000000 00:00 0 [heap]
7f09f38f8000-7f09f3904000 r-xp 00000000 ca:01 271911 /lib64/libnss_files-2.17.so
7f09f3904000-7f09f3b03000 ---p 0000c000 ca:01 271911 /lib64/libnss_files-2.17.so
-
- 類似のコマンド「needs-restarting」を見ると、「00:」を除外することで実装してる。
-
- cmdlineを参照しているが、環境によって出方が違うのでは?
- ロジックから推測するとcmdlineで欲しいのはファイルのフルパスだが、環境によってはフルパスになっていないプロセスがある
- 一部のプロセスの結果が出てこないことは、これが原因だと思われる
[root@localhost 655]# more cmdline
/usr/sbin/crond
[root@localhost 655]# uname -a
Linux localhost.localdomain 3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost 655]# more /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@ip-192-168-0-188 2568]# more cmdline
crond
[root@ip-192-168-0-188 2568]# uname -a
Linux ip-192-168-0-188 4.9.75-25.55.amzn1.x86_64 #1 SMP Fri Jan 5 23:50:27 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-192-168-0-188 2568]# more /etc/system-release
Amazon Linux AMI release 2017.03
※同じ環境でもフルパスになっているものもある
# cat /proc/2410/cmdline
/usr/sbin/acpid
-
- そもそもcmdlineを調べる必要がない。mapsの中に含まれている。
-
- deletedフラグが付いてるものも影響ありと判断してるもよう(ただし#only mildly retarded)
個人的には影響なしとして除外しても良いと思うのだけど-
https://github.com/rpm-software-management/yum-utils/blob/feb458ecfa22d9575f6aad50d2b7b589e43aa7bd/needs-restarting.py#L200
- 「needs-restarting」だと、deletedが付いているものは影響ありと判断している。
yumでインストールされたファイルは、「 /usr/lib/python2.7/dist-packages/yum/misc.py 」に存在
対応
- rpm-software-managementにPullRequest送った
- https://github.com/rpm-software-management/yum/pull/67