これは
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
ソースを眺めていて, Python の yum モジュールを弄ってみました.
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 はパッケージをインストールした時間で, この時間とプロセスの起動時間を比較して再起動の要不要を判断しているようです.
ということで…
勉強になりました.