apachectl graceful で segfault part2
以前、apachectl graceful を実行すると、segfault で子プロセスが止まっていて、php7.3 に 統一したら、なぜかしら問題解決をしていたが、症状が再発。
また、mbstring で segfault が発生している。
解決しないので、/etc/logrotate.d/apache2 を修正
/var/log/apache2/*.log { : postrotate if invoke-rc.d apache2 status > /dev/null 2>&1; then ¥ invoke-rc.d apache2 stop > /dev/null 2>&1; ¥ invoke-rc.d apache2 start > /dev/null 2>&1; ¥ fi ; endscript }
dhcp-evalの使い方
自宅ネットワークでは、利用する機器の状態を把握するために固定IPアドレスを割り振っているが、DHCP の hardware ethernet で、Mac アドレスをみて配布している。この DHCP のリース時に、状態に合わせた処理を起動するための機能がある。
- dhcp-eval(isc-dhcp のマニュアル)
on commit などで script を実行
on commit , on release , on expiry を設定すると、IPアドレス割り振り時にプログラムを起動できる。
# vi /etc/dhcp/dhcpd.conf : # IPアドレス割り振り時に on-commit.sh を起動 on commit { set clip = binary-to-ascii(10, 8, ".", leased-address); set clhw = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)); execute("/etc/dhcp/on-commit.sh", clip, clhw); } # vi /etc/dhcp/on-commit.sh #!/bin/bash # IPアドレスを割り振り時にメールを送る IP=$1 MAC=$2 if [ -n "$IP" -a -n "$MAC" ]; then echo "$IP $MAC" \ | /usr/bin/mail -s "dhcp on commit" foo@example.com fi
on commit の例で示した方法は、DHCPがアドレスをリースする度に呼び出される。スクリプトは同期して行われるため、遅い処理の場合には アドレス割り振りに支障がでるかもしれない。よって、スクリプトはシンプルなものを使う必要がある。
自宅では、host { fixed-address … } で、固定しているとはいえ WiFi なスマホだと、電波強度不足で再接続が発生する時だと、頻繁にメールが届くことになる。接続情報を保存するなどの Script を書かないとウザぃ。
host 毎に script を実行
こういうことができると、状況に合わせてリースを制御したくなる。自宅で使う場合だと、子供が長い時間使っている場合には、IPアドレスのリースを失敗させて、ネットワーク接続を切りたいかもしれない。
こういう場合には、host … { } の中に、execute を埋め込むことができる。しかも、execute で実行される script の返り値で、lease を失敗させることもできる。
# /etc/dhcp/dhcpd.conf : host game-machine { hardware ethernet 00:11:22:33:44:55 ; fixed-address 192.168.11.222 ; execute( "/etc/dhcp/lease-check.sh , "192.168.11.222" , "00:11:22:33:44:55" ) ; } # vi /etc/dhcp/lease-check.sh #!/bin/bash # DHCP接続を判定する script IP=$1 MAC=$2 if [ -n "$IP" -a -n "$MAC" ]; then if [ アドレスを許可する条件 ]; then # 接続許可 exit 1 else # 接続禁止 exit 0 fi fi
注意: 最初 lease-check.sh は許可するときに shell-script 成功時を表す exit 0 を返せばいいとおもったけど、逆だったな。
メールの日本語化
自宅で動かしている様々な機能で、警告メールを送信することも多いけど、基本英字。日本語でも文字コードが utf-8 なら、mail コマンドで送ることもできるけど、日本語の定番のJISコードで送りたい。そこで、Subject をMIMEエンコード、本文をJISコードで送るスクリプトを設置。
#!/bin/bash # 日本語のメールを送る(SubjectのMIME化,本文のJIS,Content-Type出力) # Usage: mail-jp -s SUBJECT -r FROM TO_ADDR ... SUBJECT="" FROM="" TO="" ( # オプション(subject,from)引数処理 while [ $# -gt 0 ]; do case $1 in '-s' ) SUBJECT=$2 shift ;; '-r' ) FROM=$2 shift ;; * ) # レシビの出力 [ -n "$FROM" ] && echo "From: $FROM" [ -n "$SUBJECT" ] \ && echo "Subject: $SUBJECT" | /usr/bin/nkf -M echo 'Content-Type: text/plain charset="iso-2022-jp"' echo 'Content-Transfer-Encoding: 7bit' break ;; esac shift done # 引数(to:メールアドレス) while [ $# -gt 0 ]; do echo "To: $1" shift done echo "" # 本文 /usr/bin/nkf -j ) | /usr/sbin/sendmail -t
apachectl graceful で segmentation fault
以前からたまに発生していた、夜中になると、Webサーバが停止するトラブル。
確認をすると、logrotate あたりの cron で、“apachectl graceful”を実行すると、apache2 の子プロセスが、segmentation fault で落ちている。
最初は、エラーメッセージに geoip あたりのモジュールのエラーが出ていたので、いろいろ調べたけど改善せず。根本の原因ではなかったようで、更新をダメ元でかけているうちに出なくなった。
以前に、同じ症状で、 php7.2 → php7.0 にしていたけど、改めて最新パッケージにするために、最新の php7.3 に切り替える。これにより、graceful をかけても、落ちなくなった。
$ sudo aptitude install php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-gd php7.3-imap php7.3-json php7.3-mbstring php7.3-mysql $ sudo a2dismod php7.0 $ sudo a2enmod php7.3 $ sudo /etc/init.d/apache2 restart
しかし、最新の php7.3 にあげたら、wordpress の投稿時に、以下のようなメッセージが表示されるようになった。PHPのcompact()の説明にも、php7.3から E_NOTICE を出すようになったと書いてある。
Notice: compact() : Undefined variable:...
エラー警告は消したくないけど、デバッグモードを外す。
/* /etc/wordpress/config-default.php */ define( 'WP_DEBUG' , false ) ;
Debian25周年
Debian/GNU Linux も25周年らしい。Linuxを使い始めたのは、0.98 の頃だったと思うけど フロッピーディスク 15枚ぐらいでインストールしてたと思う。途中からアップデートの容易さから、ディストリビューションを Debian に乗り換えたのは、Blog が残ってる 2003 年頃だと思う。Woody あたりか。potato も使った覚えが微妙にあるし、もう少し前かなぁ。
夜中にapacheが落ちる
php7.2→php7.0に戻す
色々と試すと、apache2 の reload 時に、”apache2ctl graceful” を実行すると、以下のようなエラーが出ている。Aug 9 18:48:39 perrine kernel: [xxx] apache2[xxx]: segfault at ... error 15 in mbstring.so[xxx]php7.x-mbstring が原因かと思い、消したりしたけど、別のエラーが出る。色々試しても改善せず、ひとまず、php7.2→php7.0 を行う。 そのくせ、php7.0 で動かなかった wordpress の 画像回転とかの php-gd 使ったのが動くようになってるし。
php7.0→php7.2
phpを、php5→php7.0 に更新してから、WordPress の画像回転編集ができなくなっていたが、php7.2 では、使っていた wordpress のプラグインで警告が表示されるのでやめていたけど、php7.2 に更新作業を行った。
警告がでるのが、php のコードを記述できる phpcode widget だった。この機能を使っていたのは、include( “…html” ) を使いたかったため。今回、include ではなく、iframe を使うようにすることで、phpcode を使わないようにした。
ただ、このphpcode のプラグインをアンインストールしようとすると、エラーがでてアンインストールが失敗する。しかたがないので、一時的に php7.2 → php7.0 に切り替えて、phpcode をアンインストールして、再び php7.0 → php7.2 に戻す必要があった。
www.googleapis.comの名前引き
自宅では、予定を google-home で自動で喋らせたりするために、gcalcli などのコマンドを使っている。しかし、最近エラーで予定取得に失敗することが増えた。python 関係のライブラリの更新の不整合かと思っていたが、どうも www.googleapis.com の問題のよう。
gcalcli がエラーになったり、成功したりと再現性がないので、エラーメッセージで www.googleapis.com に接続できないっていうし、”nslookup www.googleapis.com” を実行すると、名前引きに失敗する。しかしながら、”nslookup www.googleapis.com 8.8.8.8″ なら成功する。何度か調べていると、通常の nslookup でも名前がひけたりする。意味不明。
bind の設定は….以前、セキュリティ対策で導入した、”OpenDNS (Cisco Umbrella)”を使うようになっている。これが原因か…。bindの設定を修正して、安定して gcalcli が動くようになったかな。
# Cisco Umbrella は、怪しいサイトの可能性の場合、名前引きを失敗させる Open な DNS
Google API を使った攻撃があるのか? OpenDNS にグレー判定されてんの?
暑さの測定
以前購入した、Raspberry-Pi 内蔵の MZ-80C のミニチュアは、温度・湿度・気圧のセンサーを付けて、2Fのトイレに設置していたけど、WiFiが若干不安定だったので、常時サーバで記録はしていなかった。しかし、この暑さなので、エアコンの無い部屋の温度を測定したかったので、改めて設定してみた。
Raspberry-Pi の inetd の echo サーバの所に温度測定スクリプトを記載して、”/usr/bin/nc raspberry-pi 7″ で測定できるように設定し、munin 用のデータ取得スクリプトを書いて設定。このクソ暑い温度を測ってみた。
家の西側の2会のトイレに設置しているので、夕方が最高温度で、家の中でも34℃越え。湿度は、トイレのドアを開放すると、大きく変化するようだ。
icingaからgoogle-home-notifierで警告
あまりにも暑い日が続くなか、夜は涼しくなるかとエアコンを控えめにすると、暑さで目が覚めることもある。部屋の温度は、温度・湿度センサーで測っているし、google-home-notifier を使って暑さの警告をしゃべらせてみる。単純に温度が設定温度を越えたら…なんてプログラムだと、頻繁に喋られてもうるさいし、icinga から呼び出させてみた。
警告時にプログラムを起動
## /etc/icinga/commands.cfg 追記 ## # 'notify-host-by-program' command definition define command{ command_name notify-host-by-program command_line /etc/icinga/commands-host.sh \ "$HOSTNAME$" "$NOTIFICATIONTYPE$" \ "$HOSTSTATE$" "$HOSTOUTPUT$" } # 'notify-service-by-program' command definition define command{ command_name notify-service-by-program command_line /etc/icinga/commands-service.sh \ "$HOSTNAME$" "$SERVICESESC$" "$NOTIFICATIONTYPE$" \ "$SERVICESTATE$" "$SERVICEOUTPUT$" } ## /etc/icinga/objects/contacts_icinga.cfg 追記 ## define contact{ contact_name notifyProgram alias NotifyProgram service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r host_notification_options d,r service_notification_commands notify-service-by-program host_notification_commands notify-host-by-program email foobar@example.com } define contactgroup{ contactgroup_name adminsProgram alias Administrators and Notify Program members root,notifyProgram }
温度センサーの設定
## /etc/icinga/objects/localhost_icinga.cfg ## # USBRH define service{ use generic-service host_name localhost service_description USBRH check_command check_usbrh2!32!35!81!85 contact_groups adminsProgram }
## /etc/icinga/commands-service.sh ## #!/bin/bash # icinga からプログラムにより警告 # ((commands.cfg を参照)) # /etc/icinga/commands-service.sh # "$HOSTNAME$" "$SERVICESESC$" "$NOTIFICATIONTYPE$" # "$SERVICESTATE$" "$SERVICEOUTPUT$" case "$2-$3" in USBRH-PROBLEM ) case "$4" in WARNING | CRITICAL ) if [ "$4" == "CRITICAL" ]; then MESS="部屋の温度が危険です。" else MESS="部屋の温度に注意してください。" fi /usr/bin/printf "%s %.1f 度 %.1f %%" "$MESS" \ `温度と湿度を取得するスクリプト` \ | 標準入力をgoogle-home-notifierに送るスクリプト ;; esac ;; esac