自作スクリプトのエラー対策 try-catch
自宅で動かしているスクリプト、自前だから手抜きもあって、サーバトラブル時には他の機器が巻き込まれてエラーが増えることも多い。自室の homebridge などを動かしている Raspberry-Pi が暑さもあってか、再起動させたら一時的に気絶。復旧は問題なかったけど、気絶中に他の外気温測定のRaspberry-Pi がブローカーとなっている Raspberry-Pi が落ちているため、MQTT のデータ送信に失敗のエラーを出してる。
ちゃんと、connect で出るエラーを try-except で例外処理を追加した。
try : client = mqtt.Client( ... ) client.connect( BROKER ) client.publish( ... ) except ValueError as err : print( err ) except OSError as err : print( err )
以前から、トラブル時にウザいのが、Perl で書かれた RSS 情報をまとめるスクリプト。Perl での try-catch もどきということで eval{} if ( $@ ) … でエラー対策してるつもりなんだけどトラブル時のエラーがうまく動いていないような。今回あらためて、Perl try-catch で検索したら、Perl 5.34 で try-catch が実験的にサポートされているらしいので使ってみた。
use feature qw( try ) ;
no warnings "experimental::try" ;
:
try {
$feed->merge( $rss ) ;
} catch( $e ) {
print "catch $e" ;
}
# eval { $feed->merge( $rss ) ; } ;
# if ( $@ ) {
# warn "..." ;
# }
スクリプト言語の比較
Raspberry Pi で、自宅内の温湿度管理とか色々やっていて、shell や perl や python などのスクリプトを使っているけど、ただでさえ遅い Raspberry-Pi だし、少しでも軽く動いてほしくて、lua なども使っている。
でも、shell だと、bash で書いているけど、高機能な分だけ遅いし、少しでも軽くなればと、インストールされているスクリプト言語のサイズを改めて比較をしてみた。
$ ls -al <いろいろ> -rwxr-xr-x 1 root root 14000 1月 2 2021 /usr/bin/lua50 -rwxr-xr-x 1 root root 91904 12月 10 2020 /bin/dash -rwxr-xr-x 1 root root 92292 12月 22 2018 /bin/sed -rwxr-xr-x 1 root root 120704 2月 17 2020 /usr/bin/mawk -rwxr-xr-x 1 root root 133048 8月 1 2016 /usr/bin/lua5.1 -rwxr-xr-x 1 root root 974312 3月 28 2022 /bin/bash -rwxr-xr-x 2 root root 3201036 9月 25 2021 /usr/bin/perl5.32.1 -rwxr-xr-x 1 root root 4703672 3月 12 2021 /usr/bin/python3.9
個人的には、軽いスクリプトというと、sed < awk < lua < bash < perl < python というイメージで使い分けをしていた。
しかし、これを見ると、bash と dash で10倍の差、軽くなればと使っていた lua だけど、lua5.1 と lua50 でも 10 倍の差がある。perl だと bash の 3倍、python だと bash の5倍。バイナリのサイズが単純に処理速度に反映される訳ではないけど、これを見る限り、自分で書いている手抜きスクリプトであれば、dash や lua50 で動かした方がよさそうだな。
また、下手に Perl を使うぐらいなら、bash の中で sed や awk を交えながらスクリプトを書くことも多いけど、下手に bash の中で sed や awk をガシガシ使ったら、あんまり早くなさそうだな。
これからは、lua50 < dash < sed , awk < bash < perl < python かな。
Raspberry-Pi MZ80C のボード差し替え
RPi model A+ が異常
以前に購入した Raspberry-Pi model A+ の MZ80C だけど、ボードがおかしくなっているのか、CPU 負荷がアイドル状態なのに 100% となっている。同様の Rapberry Pi と処理速度も変わらないし、何か変。RPi3 のボードに比べると処理速度も遅いし、RPi 3 model A+ のボードが同じ RPi3 model B より割安なのでボード差し替えをやってみる。
RPi 3 model A+ に差し替え
せっかくだし、表示部分も I2C 接続の SSD1306 の OLED Display を買う。
https://github.com/adafruit/Adafruit_Python_SSD1306
((( SSD1306 ))) GND VCC SCL SDA 黒 白 灰 紫 ((( BME280 ))) VDD GND NC SDI SDO SCK VDD GND -- SDA --- SCL 白 赤 × 黄 × 青 ((( Raspberry-Pi ))) 3.3 SDA SCK × GND
BME280, Adafruit SSD1306を使えるように
この RPi は、2Fのトイレに設置して、2Fの廊下全体の温度を測っていた。なので、載せ替えした RPi にも同様の機能を移植。
なんとか動くようになったかな。
ただ、syslog を見ると、電源電圧不足の警告が出ているし、たまに繋がらなくなる。確認すると再起動してる。USB電源アダプタ電流とれるやつに差し替えが必要だな。
次のホームサーバの検討
先日、安定して動いていた自宅サーバでトラブル発生。自宅BLOGをみると 2010年から動かしているみたいだな。そろそろ、次のサーバへの移行も考える時期かな。
最近の運用状況からすれば、CPU能力が必要な訳ではないし、今のサーバでも能力不足は特に感じない。小型PC用の CPUがN100 , Mem=8GB で、Windows11 が動くのものが、3万円ほどでも見つかる。
でも、同じような性能であれば、かなり古い macbookair に Ubuntu を入れたマシンもある。性能面で持ち運びで使う機会もないし、これでもいいのかな。とはいえ、そのmacbookair も調べると 2010 年の製品。SSDとかバッテリーは途中で買えているとはいえ、現行の自宅サーバと同年代か。
Twitter API有償化
Twitter に書き込んでいた自分の記事を、週末に自鯖のWordPress に転載させていたけど、昨日は認証に失敗。Twitter API ver 1.1 で記事を上げていたけど、Twitter API が有償化の影響だろう。
話には聞いていたけど、API で読むにしても書き込むにしても大した量じゃなし、影響考えてなかった。改めて確認すると、Tweet は一定量以下なら無償で利用できるけど、Tweet 取得は有償化の対象らしい。
んで、確認すると、Tweet取得をするのなら $100/月。うーん、使う気起こらねぇ。
自宅サーバトラブル
エコキュートのメモを書き残していたら、急に自宅サーバに繋がらなくなる。ping も通らない。
デバイスが見つけられなくなり、起動できなかったけど BIOS の boot device を色々触っていたら、なぜだか復帰。
一時的なトラブルならいいけど、サーバ故障の予兆かもしれないので、メモとして残す。
そろそろ、サーバも更新の準備をしておくべきかも。
Raspberry Pi の bullseye 更新
いつも大きい更新をかける時は、依存関係でトラブルから、利用頻度の低いパッケージを削除したり、重要なパッケージだけ個別に更新していたけど、”apt upgrade –without-new-pkgs” は、便利なコマンド。これなら、ディスク容量が少ない Raspberry-Pi でも途中で容量不足で止まったりといった心配も少ない。
((( busterで更新 ))) $ sudo aptitude update ; sudo aptitude safe-upgrade ((( bullseyeの登録 ))) $ sudo vi /etc/apt/sources.list.d/11-bullseye.list deb http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi deb-src http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi ((( 最小限アップグレード ))) $ sudo aptitude $ sudo apt upgrade --without-new-pkgs $ sudo aptitude safe-upgrade
2台まとめての buster→bullseye 更新でいくつか、自分の家専用の処理が動かなくなったが、ボチボチと修正し復帰かな。
リモート監視 nagios-nrpe を使ってみる
Raspberry-Pi で WiFi スキャンをさせたいけど、警告を出すために raspberry-pi 側に nagios4 のような本格的な監視システムを入れるのは資源のムダに思えたので、軽量な監視とすべく、リモート監視用の nagios-nrpe-server を使ってみた。
メインサーバ port=5666 リモート 監視プラグイン
nagios4 ----> check_nrpe ------------> nrpe ----> check_root
nagios-nrpe-plugin nagios-nrpe-server
nrpe は リモートの監視プラグインを check_nrpe と nagios-nrpe-server が経由して呼出してくれる。
リモートの監視側
nagios-nrpe-server をインストールして、監視サーバからの接続を許可する。インターネット経由で監視するなら、5666 ポートが通るようにファイアウォールの設定が必要。
((( 必要パッケージのインストール )))
$ sudo aptitude install nagios-nrpe-server
((( /etc/nagios/nrpe.cfg )))
# 監視サーバからの接続を許可
allowed_hosts=127.0.0.1,::1,192.168.xx.00/24
~~~~~~~~~~~~~~~~~(追加)
((( /etc/nagios/nrpe.d/enabled.cfg )))
# 監視するためのチェック処理を登録。nrpe.cfg から nrpe.d/*.cfg に設定を移動
command[check_root]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /
command[check_load]=/usr/lib/nagios/plugins/check_load $ARG1$
((( /etc/default/nagios-nrpe-server )))
# 自宅内のような閉じた中でSSLが不要の場合
NRPE_OPTS="-n"
((( nagios-nrpe-server を再起動 )))
$ sudo systemctl restart nagios-nrpe-server
メインの監視サーバ側
nrpe用のプラグインをインストールすると、/etc/nagios-plugins/config/check_nrpe.cfg や /usr/lib/nagios/plugins/check_nrpe を入れてくれる。
((( 監視側にnrpe用のプラグインを追加 )))
$ sudo aptitude install nagios-nrpe-plugin # nagios or icinga はインストール済み
((( nrpe の入ったリモートが呼び出せるか確認 )))
$ /usr/lib/nagios/plugins/check_nrpe -H リモート -c check_root
DISK OK - free space: / 21321 MB (74% inode=86%);| /=7363MB;23944;26937;0;29930
((( /etc/nagios-plugins/config/check_nrpe.cfg )))
# nagios/icingaなどのcommand設定の確認
# this command runs a program $ARG1$ with no arguments and enables SSL support
define command {
command_name check_nrpe
command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
# this command runs a program $ARG1$ with no arguments and disables SSL support
define command {
command_name check_nrpe_nossl
command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -n
}
((( nagios4 のサービス監視に check_nrpe を呼出す設定を追加 )))
define service{
use local-service
host_name リモート
service_description DISK
check_command check_nrpe!check_root
# check_command check_nrpe_nossl!check_root # SSLなしで設定した場合
}
((( nagios4 を再起動 )))
$ sudo systemctl restart nagios4
nagios4 で監視ができるようになったので、温湿度センサーや空気品質センサーの確認も nrpe 経由に変更してみた。

WiFiスキャンをさせてみた
自宅内のネットワークに繋がらない時があって悩んだら、外で使っていたモバイルルータがつけっぱなしで、自宅内ネットワークのサービスに接続できないのが原因だったりする。パケットも無駄に消費するので、自宅内でモバイルルータが動いていたら警告させるようにしたい。
wifi scan
メインサーバは有線だけなので、有線LAN接続で WiFi が空いている Raspberry-Pi で監視させてみた。
$ sudo iw dev wlan0 scan | grep "SSID: ルータのSSID"
最初は homebridge の homebridge-cmdswitch2 の state_cmd に仕込んでみたけど、モバイルルータが動いていたら警告してほしい。Siri のオートメーション経由で警告することもできるかもしれないけど、スマホに頼る形になるなぁ。
nagios で警告させたいけど、raspberry-pi に nagios を入れるのは資源のムダに思える。ということで、Raspberry-Pi には nagios の監視をリモートで呼び出す nagios-nrpe-server を 入れて、上記 iw コマンドを動かす check スクリプトを書いてみた。
check_iwscan
nagios-nrpe-server から呼出す際に、Raspberry-Pi で動かすのもあるし、OS 負荷が軽くなるように Lua で書いてみた。
#!/usr/bin/lua
-- 見つけるべきSSID
local check_list = {}
check_list[ "tsaitoh.net" ] = "ok"
check_list[ "tsaitoh.net_e5785" ] = "warning"
check_list[ "tsaitoh.net_hwd14" ] = "critical"
-- 見つけたSSID毎の数
local count = {}
count[ "ok" ] = 0
count[ "warning" ] = 0
count[ "critical" ] = 0
-- スキャン結果を処理
local handle = io.popen( "/usr/bin/sudo /sbin/iw dev wlan0 scan" , "r" )
if handle then
for line in handle:lines() do
-- SSID を抽出
ssid = string.match( line , "^%s*SSID: (.+)$" )
if ssid then
-- SSID のカウント
local lv = check_list[ssid]
if lv then
count[lv] = count[lv] + 1
end
-- print( ssid ) ;
end
end
handle:close()
end
-- カウント結果に応じたexit値を決める
local status = 0
local st_mess = "Ok"
if count["critical"] > 0 then
status = 2
st_mess = "Critical"
elseif count[ "warning" ] > 0 then
status = 1
st_mess = "Warning"
end
-- 結果の表示
print( string.format( "IWSCAN %s - ok:%d/warn:%d/critical:%d" ,
st_mess , count["ok"] , count["warning"] , count["critical"] ) )
os.exit( status )


