systemd と SysVinit の シャットダウンフローの違い
SysVinit の場合は、単純にランレベルに応じた rc.dフォルダ にある K で始まるファイルを ファイル名の昇順で、コマンドライン引数に stop を付けて 順番に起動していくだけ でした。
systemd の場合は、特別な指定をしない限りは、意図しない順にサービスを落とそうとする可能性があるようです。
つまり、必ずしも、起動した逆順で サービス停止されるわけではないということです。
その為、互いに依存性があり、先に 別サービスを落とさないと 落とせないサービスがある場合、シャットダウン中にフリーズしてしまう わけです。
どうやって、依存する別サービスを 先に止めるか
やる事は単純。shutdown.target に、起動時と 同じように、依存性指定を入れておけばよい のです。
bash
# cp -p /usr/lib/systemd/system/shutdown.target /etc/systemd/system/
# vim /etc/systemd/system/shutdown.target
/etc/systemd/system/shutdown.target の [Unit] に After指定で、シャットダウンプロセスに入る前に 事前に止めておかないといけない Unit を指定します。
例えば、
shutdown.target
After=httpd.service postgresql.service rc-local.service
とすれば、これらの 依存サービスを先に止めた上で、シャットダウンプロセスが 安全に始まります。