ようへいの日々精進XP

よかろうもん

needs-restarting というパッケージ便利だったのでメモ

これは

qiita.com

初老丸 Advent Calendar 2017 8 日目の記事になる予定です.

tl;dr

needs-restarting というパッケージ便利だったのでメモです.

例えば, Amazon Linux において mod24_ssl をインストールした際に, openssl や openssl-devel 等もうっかりインストールされてしまって, 依存しているプロセスの再起動が必要になった時に, needs-restarting を実行すれば, よしなに関連しているプロセス名を教えてくれます.

for example

以下は mod24_ssl をインストールした後, needs-restarting を実行した図です.

まずは, mod24_ssl をインストールします.

$ sudo yum install mod24_ssl

インストールした後で...needs-restarting を実行すると...

$ needs-restarting
14729 : /usr/sbin/httpd
15232 : /usr/sbin/httpd
14653 : /usr/sbin/httpd
2522 : sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
11256 : sshd: ore-user@pts/0
11254 : sshd: ore-user [priv]
2482 : /usr/sbin/sshd
14661 : /usr/sbin/httpd
14631 : /usr/sbin/httpd
14632 : /usr/sbin/httpd
14631 : /usr/sbin/httpd
14599 : /usr/sbin/httpd
2512 : sendmail: accepting connections

mod24_ssl を導入したこと(依存パッケージを含む)により, 再起動が必要なプロセスの一覧がリストアップされました.

リストの中から, ピックアップしてプロセスを再起動するもよし, サーバーを丸っと再起動するもよし...それは, 貴方のお好みで.

導入

yum-utils パッケージ

Amazon Linux(Amazon Linux AMI release 2016.09)であれば, yum-utils パッケージに含まれていました.

$ yum info yum-utils
Loaded plugins: priorities, update-motd, upgrade-helper
Installed Packages
Name        : yum-utils
Arch        : noarch
Version     : 1.1.31
Release     : 40.29.amzn1
Size        : 328 k
Repo        : installed
From repo   : amzn-main
Summary     : Utilities based around the yum package manager
URL         : http://yum.baseurl.org/download/yum-utils/
License     : GPLv2+
Description : yum-utils is a collection of utilities and examples for the yum package
            : manager. It includes utilities by different authors that make yum easier and
            : more powerful to use. These tools include: debuginfo-install,
            : find-repos-of-install, needs-restarting, package-cleanup, repoclosure,
            : repodiff, repo-graph, repomanage, repoquery, repo-rss, reposync,
            : repotrack, show-installed, show-changed-rco, verifytree, yumdownloader,
            : yum-builddep, yum-complete-transaction, yum-config-manager, yum-debug-dump,
            : yum-debug-restore and yum-groups-manager.

以下のように yum-utils をインストールすれば needs-restarting も利用可能になります.

$ sudo yum install yum-utils

... 略 ...

$ needs-restarting --help
Usage:
    needs-restarting: Report a list of process ids of programs that started
                    running before they or some component they use were updated.


Options:
  -h, --help        show this help message and exit
  -u, --useronly    show processes for my userid only
  -r, --reboothint  only report whether a full reboot is required (returns 1)
                    or not (returns 0)
  -s, --services    list the affected systemd services only

ところで... needs-restarting の正体は

Python スクリプトでした.

$ file /usr/bin/needs-restarting
/usr/bin/needs-restarting: Python script, ASCII text executable

大元は, 以下のソースだと思います.

github.com

ソースを眺めていて, Pythonyum モジュールを弄ってみました.

CentOS 6 の Docker コンテナイメージ上で, 以下のようなスクリプトを設置した後で httpd パッケージをインストールしてみました.

import sys
import yum
import yum.misc
sys.path.insert(0,'/usr/share/yum-cli')
import utils # https://programtalk.com/vs2/?source=python/11282/yum/utils.py

REBOOTPKGS = ['kernel', 'glibc', 'linux-firmware', 'systemd', 'udev',
              'openssl-libs', 'gnutls', 'dbus']

yb = yum.YumBase()
# print(utils.get_boot_time())
# print(dir(utils))
for pkg in yb.rpmdb.searchNames(REBOOTPKGS):
   print(str(pkg) + "\t" + str(pkg.installtime))
   # if float(pkg.installtime) > float(pid_start):
   #     print(pkg)

スクリプトを実行すると, 以下のように出力されました.

[root@3eaee0ff14c9 ~]# python test.py
Loaded plugins: fastestmirror, ovl
glibc-2.12-1.209.el6_9.2.x86_64 1501607710
udev-147-2.73.el6_8.2.x86_64    1512570506

右の UnixTime はパッケージをインストールした時間で, この時間とプロセスの起動時間を比較して再起動の要不要を判断しているようです.

ということで...

勉強になりました.