愛島発電所

QT SOLAR 愛島発電所

本日の発電量
294 kWh
現在の日射量
59 Wh/㎡
現在の外気温
15.4 ℃

(2024/05/20 10:48 更新)

下増田発電所

QT SOLAR 下増田発電所

本日の発電量
33 kWh
現在の日射量
55 Wh/㎡
現在の外気温
15.9 ℃

(2024/05/20 10:51 更新)

北原東発電所

QT SOLAR 北原東発電所

本日の発電量
49 kWh
現在の日射量
51 Wh/㎡
現在の外気温
15.4 ℃

(2024/05/20 10:36 更新)

長久良辺発電所

QT SOLAR 長久良辺発電所

本日の発電量
59 kWh
現在の日射量
78 Wh/㎡
現在の外気温
16.7 ℃

(2024/05/20 10:51 更新)

白坂発電所

QT SOLAR 白坂発電所

本日の発電量
59 kWh
現在の日射量
51 Wh/㎡
現在の外気温
17.1 ℃

(2024/05/20 10:58 更新)

清水沢発電所

QT SOLAR 清水沢発電所

本日の発電量
56 kWh
現在の日射量
72 Wh/㎡
現在の外気温
16.4 ℃

(2024/05/20 10:36 更新)

Daemon[自動再起動編] | Perlで作るサーバーサービス

指定したデーモンが起動していなければ起動させるシェルスクリプトデーモンです。サーバー起動時はもちろん、なんらかの要因で指定したデーモンが落ちてしまった場合も、再起動を試みます。

Perlスクリプトで書いたデーモンでは、ちょっとしたエラーの発生で落ちることのないよう例外処理による対策をしました。

しかしながら、それでも落ちてしまう場合もあります。そこで、落ちていたら再起動させるシェルスクリプトを用意してみます。

シェルスクリプトの機能は次の通り。

  • 一定時間毎に指定のデーモンの起動状態を確認する。
  • 指定のデーモンが起動していなかったら起動させる。

dcd.sh

#! /bin/sh
# dcd : Daemon Controller Daemon
processName=/home/your-account/your-daemon.pl
while true
do
isExist=`ps aux | grep "$processName" | grep -v grep | wc -l`
if [ $isExist = 1 ]
then
:
else
$processName
fi
sleep 60
done

試す場合。

sh ./dcd.sh &

実行権限を与えればsh不要。

chmod 755 ./dcd.sh
./dcd.sh &

このシェルスクリプトを、start-stop-daemonを使った起動シェルスクリプトで自動起動させます。

ひな形があるのでコピーしてそれを編集します。実行権限も与えます。

$ sudo cp /etc/init.d/skeleton /etc/init.d/dcd
$ sudo chmod 755 /etc/init.d/dcd
$ sudo vi /etc/init.d/skeleton /etc/init.d/dcd

複数ファイルを開いていますが、ファイル間の移動はnNを使います。

変更は以下の通り。変更した行のみ記載してます。

NAME=dcd
DAEMON=/home/your-account/$NAME.sh
#DAEMON_ARGS="--options args"
start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $DAEMON \
|| return 2
echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2

ランレベルを設定しておきます。

$ sudo sysv-rc-conf

サーバーを再起動して確かめてみましょう。

$ service dcd status
* dcd is running

Perlスクリプトで書いたデーモンも起動しているか確認してみましょう。

ps aux | grep your-daemon.pl
root      1430  0.0  0.1 140948 15676 ?        S    16:56   0:00 /usr/bin/perl /home/your-account/your-daemon.pl

こちらも起動していますね。

さらに、試しにこのPerlスクリプトで書いたデーモンプロセスをKILLしてみると、1分以内にプロセスが再び生成されることが確認できます。

複数Perlデーモンの監視

Perlスクリプトで書いた複数のデーモンプロセスを監視する場合は、こんな感じにすれば良いと思います。

mdcd.sh

#!/bin/bash
# Notice: sh -> dash in case of Ubuntu
# mdcd : Multi Daemon Controller Daemon ver 1.0
processNameArray=( \
/home/your-acccount/your-daemon1.pl \
/home/your-acccount/your-daemon2.pl \
/home/your-acccount/your-daemon3.pl \
)
while true
do
for processName in ${processNameArray[@]}
do
isExist=`ps aux | grep "$processName" | grep -v grep | wc -l`
if [ $isExist = 1 ]
then
:
else
$processName
fi
done
sleep 60
done

どうということもないのですが、Ubuntuで配列を使うときのシェルはbashを使うようにして下さい。

#!/bin/bash

これです、1行目のアレです、シェバン (shebang) です。

$ ls -l /bin
lrwxrwxrwx 1 root root       4 Jan 23  2015 sh -> dash

shの実体はdashになっています。dashは軽量高速シェルですが、bashのような配列をサポートしていません。

あえてsh(dash)を使うとこうなります。

$ sh mdcd.sh
mdcd.sh: 6: mdcd.sh: Syntax error: "(" unexpected

配列を使わなければいいという話もあります。