Quantcast
Channel: Linux –俺的備忘録 〜なんかいろいろ〜
Viewing all articles
Browse latest Browse all 743

systemdで特定のサービスと連動して他のプロセス・サービスを起動・停止させる

$
0
0

※2016/01/26 13:00
そもそも、systemdだったら依存関係についてAfterやBefore、Requestがあることに気づいた。
こんな回りくどいことしなくてもよさそうなので、今週中に書き直す。

 

仕事で、特定のプロセスが落ちたら強制的にそのプロセスを前提として動作しているサービスも落とす必要が出てきたので、どうにか実現できないか調べてみた。
そしたらCentOS7で採用されているsystemdでは、プロセス停止時(障害などでの異常終了時含む)に特定のコマンドを流す事ができるようで、それで実現できたのでその備忘。

systemdでサービスを管理させるファイル「/usr/lib/systemd/system/サービス名.service」に、ExecStopPostとしてコマンドを記述する事で、異常終了を含むサービス停止時にそのコマンドを流す事が出来る。
つまり、この項目にkillコマンドを記述すればよい。

例えば、maxscale.service(上がってないといけないプロセス)に以下のように記述することで、プロセス停止時にhttpd(maxscaleを前提として動作するプロセス)サービスを停止させることが出来る。
(ここではsystemctlから停止させているけど、すぐにでも停止させるなら「kill -KILL $(pgrep プロセス名)」で指定したほうがいいこともある。状況に応じて使い分けるとよいだろう。)

●/usr/lib/systemd/system/maxscale.service

[Unit]
Description=MariaDB MaxScale Database Proxy
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/var/run/maxscale/maxscale.pid
ExecStart=/usr/bin/maxscale --user=maxscale
ExecStopPost=/bin/sh -c 'systemctl stop httpd'

[Install]
WantedBy=multi-user.target

 

さて、それでは実際に動作をみてみよう。

20160124_000003

[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
root     26540     1  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26541 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26542 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26543 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26544 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26545 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
maxscale 26552     1  0 18:13 ?        00:00:00 /usr/bin/maxscale --user=maxscale
[root@localhost ~]#
[root@localhost ~]# kill $(pgrep maxscale)
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
[root@localhost ~]#

 

確かに、無事停止する事が出来た。
killで落としても動作するので、プロセスが落ちる等の障害時に使えるだろう。

ただ、一つ注意点が。。。

20160124_000004

[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl start maxscale
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
root     26748     1  1 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26749 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26750 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26751 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26752 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26753 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
maxscale 26760     1  2 18:19 ?        00:00:00 /usr/bin/maxscale --user=maxscale
[root@localhost ~]#
[root@localhost ~]# systemctl restart maxscale
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
maxscale 26795     1  1 18:20 ?        00:00:00 /usr/bin/maxscale --user=maxscale
[root@localhost ~]#

restartすると落ちます!
なので、必要ならば「ExecStartPost」でプロセス起動の記述も書いてあげると良いだろう。この辺は運用時のコマンドによると思うので環境に合わせて。

●/usr/lib/systemd/system/maxscale.service

[Unit]
Description=MariaDB MaxScale Database Proxy
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/var/run/maxscale/maxscale.pid
ExecStart=/usr/bin/maxscale --user=maxscale
ExecStartPost=/bin/sh -c 'systemctl start httpd'
ExecStopPost=/bin/sh -c 'systemctl stop httpd'

[Install]
WantedBy=multi-user.target

20160124_000005

[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
maxscale 27007     1  0 18:23 ?        00:00:00 /usr/bin/maxscale --user=maxscale
root     27009     1  1 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27013 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27014 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27015 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27016 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27017 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@localhost ~]#
[root@localhost ~]# systemctl stop maxscale
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
[root@localhost ~]#
[root@localhost ~]# systemctl start maxscale
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
maxscale 27067     1  0 18:24 ?        00:00:00 /usr/bin/maxscale --user=maxscale
root     27069     1  1 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27072 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27073 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27075 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27076 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27077 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND

 

…まぁ、停止させたいのがアプリケーションサーバ用のプロセスだったりして、LBとかが手前にいるんだったらヘルスチェックで対処させた方が良さそうな気もするけど。

 

ソフトウェア デザイン 2015年 02月号 [雑誌] ソフトウェア デザイン 2015年 02月号 [雑誌]

Viewing all articles
Browse latest Browse all 743

Trending Articles