Linuxサーバを再起動することなく全てのアップデートを反映させる方法がないか調べていたら「needs-restarting」というコマンドを発見したので備忘録として残します。
needs-restartingはyum-utilsに含まれるツールの一つ
試したサーバには既にneeds-restartingが導入されていたのでインストール作業は不要でしたが、本来はyum-utilsに含まれるツールの一つなようです。
# whereis needs-restarting needs-restarting: /usr/bin/needs-restarting /usr/share/man/man1/needs-restarting.1.gz # yum provides /usr/bin/needs-restarting yum-utils-1.1.30-40.el6.noarch : Utilities based around the yum package manager Repo : base Matched from: Filename : /usr/bin/needs-restarting yum-utils-1.1.30-40.el6.noarch : Utilities based around the yum package manager Repo : installed Matched from: Other : Provides-match: /usr/bin/needs-restarting
needs-restartingの詳細
CentOS6で利用できるneeds-restartingのオプションは以下の通り。CentOS7で利用できるバージョンだともっと高機能でサーバ再起動が必要かチェックしてくれるらしいのです。
# 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
needs-restartingを試してみる
5か月間していないサーバで試してみました。
# uptime 10:51:15 up 157 days, 5:40, 1 user, load average: 0.34, 0.24, 0.08 # needs-restarting 1234 : /usr/sbin/acpid 2323 : /sbin/mingetty/dev/tty2 2321 : /sbin/mingetty/dev/tty1 1223 : irqbalance--pid=/var/run/irqbalance.pid 1208 : /sbin/rsyslogd-i/var/run/syslogd.pid-c5 2325 : /sbin/mingetty/dev/tty3 2229 : /usr/libexec/postfix/master 1186 : auditd 5348 : /usr/sbin/httpd 2328 : /sbin/agetty/dev/ttyS0115200vt100-nav 2305 : /usr/sbin/atd 1 : /sbin/init 536 : /sbin/udevd-d 19315 : /sbin/udevd-d 2269 : crond 2257 : /usr/bin/python/usr/sbin/tuned-d-c/etc/tuned.conf 2241 : qmgr-l-tfifo-u 19314 : /sbin/udevd-d 19747 : /usr/sbin/sshd
結構ありました。Linuxはアップデートしてもサーバ再起動が不要というイメージがあるようですが、全然そんなことはないことが分かります。
可能なデーモンはどんどん再起動してみる
以下のプロセス(デーモン)はプロセスだけの再起動が可能でした。
# service acpid restart # service irqbalance restart # service rsyslog restart # service postfix restart # service auditd restart # service httpd restart # service atd restart # udevadm control --reload-rules # service crond restart # service tuned restart # service sshd restart
OS再起動以外で再起動する方法がわからないプロセス
色々試しましたが、私のスキルでは単独で再起動できないプロセスがこれらでした。PID:1の/sbin/initなんてカーネルが最初に読み込むプロセスですもんね。どうやっても無理じゃないのかな?ということで、最終的にOS再起動を行いました。
# needs-restarting 2323 : /sbin/mingetty/dev/tty2 2321 : /sbin/mingetty/dev/tty1 2325 : /sbin/mingetty/dev/tty3 2328 : /sbin/agetty/dev/ttyS0115200vt100-nav 1 : /sbin/init 536 : /sbin/udevd-d
終わりに
httpdやpostfixなど直接機能を提供するデーモンならアップデート後の再起動は忘れませんが、nssのように間接的な機能のアップデートは影響範囲が分からないですからね。そういう時にneeds-restartingは役立ちそうです。