Ubuntuのパッケージをアップデートした際にプロセス再起動が必要かを確認する

# はじめに
サーバー運用していると脆弱性対応などでパッケージのバージョンアップを行うことがよくあります。
その際、稼働中のサーバーへの影響の一つとしてサービスの再起動の発生が気になるところです。
今回はそういった場面で何を再起動したら良いかを確認する方法です。


# コマンドインストール
**Ubuntu** では `checkrestart` コマンドで再起動が必要なプロセスを確認できます。
まず、コマンドのインストールですが、これは `debian-goodies` というパッケージに入っています。

```bash:パッケージインストール
$ sudo apt-get install debian-goodies

$ which checkrestart
/usr/sbin/checkrestart
```


# 再起動プロセスの確認
では実際にチェックしてみます。

```bash:再起動プロセス確認
$ sudo checkrestart
Found 30 processes using old versions of upgraded files
(22 distinct programs)
(15 distinct packages)

Of these, 13 seem to contain systemd service definitions or init scripts which can be used to restart them.
The following packages seem to have definitions that could be used
to restart their services:
haveged:
	457	/usr/sbin/haveged
lvm2:
	429	/sbin/lvmetad
acpid:
	1225	/usr/sbin/acpid
cron:
	1214	/usr/sbin/cron
accountsservice:
	24306	/usr/lib/accountsservice/accounts-daemon
policykit-1:
	1281	/usr/lib/policykit-1/polkitd
at:
	1141	/usr/sbin/atd
rsyslog:
	1198	/usr/sbin/rsyslogd
open-iscsi:
	1144	/sbin/iscsid
	1145	/sbin/iscsid
unattended-upgrades:
	1279	/usr/share/unattended-upgrades/unattended-upgrade-shutdown
mdadm:
	1270	/sbin/mdadm
dbus:
	1173	/usr/bin/dbus-daemon
lxcfs:
	1143	/usr/bin/lxcfs

These are the systemd services:
systemctl restart accounts-daemon.service
systemctl restart polkitd.service

These are the initd scripts:
service haveged restart
service lvm2-lvmpolld restart
service lvm2 restart
service lvm2-lvmetad restart
service acpid restart
service cron restart
service atd restart
service rsyslog restart
service open-iscsi restart
service iscsid restart
service unattended-upgrades restart
service mdadm-waitidle restart
service mdadm restart
service dbus restart
service lxcfs restart

These processes (2) do not seem to have an associated init script to restart them:
isc-dhcp-client:
	980	/sbin/dhclient
dash:
	1637	/bin/dash
```

再起動が必要なプロセスがたくさん出てきました。
ここで出力されている内容は `systemd` または `init` で管理されているかどうかで変わります。

## 対応１：systemd または initd で管理されている場合
`init` で管理されている場合、以下の内容が出力されます。

```text:出力内容
The following packages seem to have definitions that could be used
to restart their services:
```
この場合、対応については続きに出力されているように `systemctl` または `service` コマンドを使って再起動します。
ここでは `cron` の場合を例に対応します。

```bash:cron再起動
$ sudo service cron restart
```

## 対応2：systemd または initd で管理されていない場合
もう一つは以下の出力がされた場合の対応です。

```text:出力内容
These processes (2) do not seem to have an associated init script to restart them:
isc-dhcp-client:
	980	/sbin/dhclient
dash:
	1637	/bin/dash
```
これはプロセスが `init`スクリプトに関連付けられていない場合に表示されます。
今回は `dash` を例に対応していきたいと思います。

まず、ここではプロセスIDが `1637` と表示されています。
それでは該当のプロセスIDが利用しているプログラムを確認します。

```bash:プログラム確認
$ cat /proc/1637/cmdline 
/bin/sh/opt/bitnami/mysql/bin/mysqld_safe--defaults-file=/opt/bitnami/mysql/my.cnf--mysqld=mysqld.bin--socket=/opt/bitnami/mysql/tmp/mysql.sock--datadir=/opt/bitnami/mysql/data--log-error=/opt/bitnami/mysql/data/mysqld.log--pid-file=/opt/bitnami/mysql/data/mysqld.pid--lower-case-table-names=1 
```
`mysql`プロセスが利用していることがわかりました。
今回、**bitnami** 環境のため専用のスクリプト `ctlscript.sh` を使って再起動を行います。
まず、利用方法について確認です。

```bash:ctlscript.sh
$ sudo /opt/bitnami/ctlscript.sh --help
usage: /opt/bitnami/ctlscript.sh help
       /opt/bitnami/ctlscript.sh (start|stop|restart|status)
       /opt/bitnami/ctlscript.sh (start|stop|restart|status) mysql
       /opt/bitnami/ctlscript.sh (start|stop|restart|status) php-fpm
       /opt/bitnami/ctlscript.sh (start|stop|restart|status) apache
       /opt/bitnami/ctlscript.sh (start|stop|restart|status) subversion

help       - this screen
start      - start the service(s)
stop       - stop  the service(s)
restart    - restart or start the service(s)
status     - show the status of the service(s)
```
それでは `mysql` の再起動を行います。

```bash:myql再起動
$ sudo /opt/bitnami/ctlscript.sh restart mysql
Unmonitored mysql
/opt/bitnami/mysql/scripts/ctl.sh : mysql stopped
/opt/bitnami/mysql/scripts/ctl.sh : mysql  started at port 3306
Monitored mysql
```
以上で再起動完了です。


# 確認
`checkrestart` コマンドで確認してみます。

```bash:checkrestart
$ sudo checkrestart
Found 28 processes using old versions of upgraded files
(20 distinct programs)
(13 distinct packages)

Of these, 12 seem to contain systemd service definitions or init scripts which can be used to restart them.
The following packages seem to have definitions that could be used
to restart their services:
haveged:
	457	/usr/sbin/haveged
lvm2:
	429	/sbin/lvmetad
dbus:
	1173	/usr/bin/dbus-daemon
accountsservice:
	24306	/usr/lib/accountsservice/accounts-daemon
policykit-1:
	1281	/usr/lib/policykit-1/polkitd
at:
	1141	/usr/sbin/atd
rsyslog:
	1198	/usr/sbin/rsyslogd
open-iscsi:
	1144	/sbin/iscsid
	1145	/sbin/iscsid
lxcfs:
	1143	/usr/bin/lxcfs
mdadm:
	1270	/sbin/mdadm
acpid:
	1225	/usr/sbin/acpid
unattended-upgrades:
	1279	/usr/share/unattended-upgrades/unattended-upgrade-shutdown

These are the systemd services:
systemctl restart accounts-daemon.service
systemctl restart polkitd.service

These are the initd scripts:
service haveged restart
service lvm2-lvmpolld restart
service lvm2 restart
service lvm2-lvmetad restart
service dbus restart
service atd restart
service rsyslog restart
service open-iscsi restart
service iscsid restart
service lxcfs restart
service mdadm-waitidle restart
service mdadm restart
service acpid restart
service unattended-upgrades restart

These processes (1) do not seem to have an associated init script to restart them:
isc-dhcp-client:
	980	/sbin/dhclient
```
対応を行なった `cron` と `dash` の2つが出力されなくなったのが確認できました。


# おわりに
パッケージをアップデートした際、再起動が必要かどうかが気になるところですがこのコマンドを使うことで解決できるのはとても助かるなと思いました。