RHEL7とかFedora24とか25とか/var/run/zabbixが消滅する事案

OS入れ替えとか、Zabbixのソースビルドからのインスコで出た問題ですが、
サーバー再起動するとPIDを作成するディレクトリごと消えて、Zabbixが起動出来なくなる問題が発生する。

するんですよ奥さん(うるさい

昔の自分ならシェルスクリプトに
mkdirでディレクトリ作って~
所有ユーザー弄って~
パーミッション弄って~
systemctl start zabbix-server投げてー

みたいな事やってました。
そんでも独学とはいえ、最近やれることが増えてきたので色々いじっていきます。

今回弄るのは/etc/init.d/zabbix-serverですね。
中を見てみます。

[sourcecode]
conf=/etc/zabbix/zabbix_server.conf
pidfile=$(grep -e "^PidFile=.*$" $conf | cut -d= -f2)
timeout=10
[/sourcecode]

この辺りで設定ファイル読んでPIDファイルの保存先を抽出してますね。
でも今はその保存先のディレクトリだけが欲しいので、別途piddirという変数へ格納してしまいます。

[sourcecode]
# grep -e "^PidFile=.*$" /etc/zabbix/zabbix_server.conf | cut -d= -f2
/var/run/zabbix/zabbix_server.pid
[/sourcecode]

変数pidfileの所と同じように実行すると上記のように。
今回は/zabbix_server.pidの部分がまるっと要らないので、この出力結果をさらに加工してしまいます。
sedを使用して加工するのはまぁ、すぐ出てきたのですが、正規表現がまだまだ苦手で・・・これは調べて対応してしまいました。

sed ‘s:/[^/]\+$::’
でいけるようです。
ちょっと調べてみました。

[]で囲まれているものは文字セット。この中に囲まれている任意の1文字がマッチする。
^ は行頭でのマッチ。行の途中に任意の文字列があってもマッチしないとか。
今回の場合は[^/]という指定なので、行頭にある/という任意の文字列と言うことになるのかな。

¥は・・・エスケープじゃね?これは/に対して働いてる形?いや・・・+の方に働いてる?
+は直前にあった文字の1回以上の繰り返し。繰り返し効いてるよねコレ・・・
$は行の終わりにマッチするとのこと。

やっぱ全部はまだ理解できねぇ・・・
今度色々やってみよう・・・。(じゃないと今作ってるツール開発もどのみち頓挫する)
ま、まぁ一応思った通りの動作にはなったようなので、これでいいんじゃないかな。

[sourcecode]
# grep -e "^PidFile=.*$" /etc/zabbix/zabbix_server.conf | cut -d= -f2 | sed 's:/[^/]\+$::'
/var/run/zabbix
[/sourcecode]

あとはぱっと見たときに分るように、変数pidfileの直下にでも追加しておきます。
変数は~・・・piddirでいいかな?

[sourcecode]piddir=$(grep -e "^PidFile=.*$" $conf | cut -d= -f2 | sed 's:/[^/]\+$::')[/sourcecode]

あとは、systemctl start zabbix-serverで動作する部分にディレクトリチェックを噛ませて、無ければ作成するようにすればいいから、

[sourcecode]start()
{
    echo -n $"Starting Zabbix server: "
    daemon $exec -c $conf
    rv=$?
    echo
    [ $rv -eq 0 ] && touch $lockfile
    return $rv
[/sourcecode]

}

上記の部分に追記していきます。

[sourcecode]start()
{
    echo -n $"Starting Zabbix server: "
    if [ ! -d $piddir ]; then
        /bin/mkdir "$piddir"
        /bin/chown zabbix:zabbix "$piddir"
        /bin/chmod 700 "$piddir"
    fi
    daemon $exec -c $conf
    rv=$?
    echo
    [ $rv -eq 0 ] && touch $lockfile
    return $rv
}[/sourcecode]

あとは、systemctl daemon-reloadコマンドを投げて、いつも通り起動させてあげるだけですかね。
Zabbix-agentも同じような感じになるので、それもやってあげないとデスネ。

※2020/04/12 16:11 直しました。変数名誤字。