システムの起動状態確認スクリプト

unix/linuxは1番目のプロセスが起動してから、ツリー構造でいっぱい処理が起動してく。花火がパーっと上がる感じ。

その1つ1つを追いかけるのはけっこうたいへん。
見落としそうにもなるし。

なるべく直観的に、なるべく素早く状況をつかむためのスクリプト。
sshしたらほぼ必ず結果見る。

結論

sshしたコマンドラインでonlchkって入力すると、サービスが動いているかどうかを教えてくれて、そのバージョンも拾う。

nari@nafslinux-ubu22:/gvis/script/proc$ onlchk
... linux CHECK END      Description: Ubuntu 22.04.1 LTS
... httpd CHECK END      Server version: Apache/2.4.52 (Ubuntu)
... smb CHECK END        Version 4.15.9-Ubuntu
... docker CHECK END     Docker version 20.10.17, build 100c701
=== Google STATUS===
...rtx1210-status > 
...rtx1210-status   Current status is disabled.
...Google -status
...Google -status jelly-fslinux us-east1-b e2-standard-8 192.168.100.218 xx.xx.xx.xx RUNNING
=== SSH Tunnel STATUS===
nafslinux.intra.gavann-it.com:43306:gcp-gvis-dklinux.intra.gavann-it.com:3306
nafslinux.intra.gavann-it.com:50022:gcp-gvis-dklinux.intra.gavann-it.com:20022
nafslinux.intra.gavann-it.com:53389:gcp-gvis-dklinux.intra.gavann-it.com:23389
nafslinux.intra.gavann-it.com:63389:gcp-gvis-dklinux.intra.gavann-it.com:33389
=== Docker Container STATUS===
docker-cl_red8-1: redhat:8gvis Up 2 hours
docker-cl_red9-1: redhat:9gvis Up 2 hours
docker-cl_ubu22-1: ubu:22gvis Up 2 hours
docker-sv_django-1: sv_django:4 Up 2 hours
docker-sv_https-portal-1: steveltn/https-portal:1 Up 2 hours
docker-sv_mariadb-1: mariadb:10.5.7 Up 2 hours
docker-sv_php74-1: docker_sv_php74 Up 2 hours
docker-sv_web118-1: nginx:1.18.0-alpine Up 2 hours
svldap-admin: osixia/phpldapadmin:latest Up 2 hours
svldap-server: osixia/openldap:latest Up 2 hours
nari@nafslinux-ubu22:/gvis/script/proc$

自分にとってはローカルlinuxは母艦みたいなもんで、その役割状態が今どうなってるのかがわかるようになってて欲しい。

大昔にhp-uxで作ったものがベース。

業務で作ったものを持ち出すわけにはいかなかったので、構成を思い出しながら自分用にsolarisで最初は作った。

その後linuxに移植してからプロセス確認以外の機能を追加して今まで使ってる。

OS変えたり、バージョン上げたりすると、コマンドのオプションとか、awkで表示させるフィールド番号とか、少しずつ微調整が必要。

チェック対象はlstって引数渡すと表示してくれる。

それぞれのサービスが生きていると判断できるためのプロセス名を、別ファイルで定義する。

nari@nafslinux-ubu22:/gvis/script/proc$ onlchk lst

### Online Check Target List

LINUX
HTTPD
SMB
DOCKER

nari@nafslinux-ubu22:/gvis/script/proc$

dockerコンテナ使う前はいっぱい書いてた。
コンテナのおかげでグッと減ってくれてる。

onlchkの本体

chkって処理を呼び出してサービス状態を表示させてから、別処理で作ってるGoogle cloud接続状態表示・sshトンネル状態・起動コンテナ一覧を表示させてる。

nari@nafslinux-ubu22:/gvis/script/proc$ cat onlchk
#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2007.12.24
##  Updated by  : 2014.04.05
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------
#--- Common Variables -----------------------------------------
LANG=C
SC_NAME=`/bin/basename $0`          # Script Name
SC_HOME=`/usr/bin/dirname $0`       # Script Home directory

#--- Local Variables ------------------------------------------
CONF=$SC_HOME/$SC_NAME.conf
RC=0

#--- Parameter Check ------------------------------------------
case    $1 in
        "lst")
                echo ""
                echo "### Online Check Target List"
                echo ""
                cat $CONF | grep '@(1)' | cut -b 6- | tr [a-z] [A-Z]
                echo ""
                exit 0
                ;;
        *)
                if      [ "$1" ]; then
                        echo ""
                        echo "usase : $0 [lst]"
                        echo ""
                        exit 1
                fi
                ;;
esac

#--- Process Check --------------------------------------------
RC=0
cat     $CONF | grep '@(1)' | cut -b 6- | \
while   read TARGET; do
        ##echo "sc_home=" $SC_HOME
        $SC_HOME/chk $TARGET
done

#--- Google Status -------------------------------------------
echo === Google STATUS===
cat /gvis/script/gcp/TunnelStatusRes.txt

#--- SSH Tunnel status ---------------------------------------
echo === SSH Tunnel STATUS===
ssh -V
ps -ef | grep ssh | grep gvis | awk '{print $29 "\n" $31 "\n" $33 "\n" $35 }'

#--- DockerContainer Check ------------------------------------
echo === Docker Container STATUS===
docker ps --format "{{.Names}}: {{.Image}} {{.Status}}" | sort

exit 0

nari@nafslinux-ubu22:/gvis/script/proc$

onlchkから呼ばれるchk

こんな感じ。

nari@nafslinux-ubu22:/gvis/script/proc$ cat chk
#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2007.12.20
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------

LANG=C
SC_NAME=`/bin/basename $0`          # Script Name
SC_HOME=`/usr/bin/dirname $0`       # Script Home directory
CONF=${SC_HOME}/${1}_chk.conf
#TARGET=`echo $1 | tr [a-z] [A-Z]`
TARGET=$1

#--- Config File Check ----------------------------------------
if      [ ! -f $CONF ]; then
        echo ""
        echo "$CONF not found ... or invalid option [ $1 ]"
        echo ""
        exit 1
fi

#--- Parameter Check ------------------------------------------
case    $2 in
        "lst")
                echo ""
                echo "### $TARGET Check Process List"
                echo ""
                cat $CONF | grep '@(1)' | cut -b 6-
                echo ""
                exit 0
                ;;
        *)
                if      [ "$2" ]; then
                        echo ""
                        echo "usase : $0 [lst]"
                        echo ""
                        exit 1
                fi
                ;;
esac
#--- Process Check --------------------------------------------
RC=0
cat $CONF | grep '@(1)' | cut -b 6- | awk '{ print $1}' | \
while   read PROCESS; do
        PS_RC=`ps aux | awk ' {print $11,$12} ' | grep "$PROCESS" | grep -v grep | wc -l`
        if      [ $PS_RC -eq 0 ]; then
                echo    "### ENVIRON[`hostname`] : $TARGET      $PROCESS" \
                        "PROCESS_NOT_FOUND" ;
        fi
done

#--- EXIT Status Check ----------------------------------------
VER=`tail -1 $CONF`
echo "... $TARGET CHECK END     " `${VER} | head -1`
exit

nari@nafslinux-ubu22:/gvis/script/proc$

unixはps -efって書いてたけどlinuxはps auxって書いてる。

unix/linuxでps -efwwって書いたらプロセス名が省略されずに表示される。
jenkinsとかjava使うサービスの引数見たいときに使う(ヒープの確保量とかね)。

状態確認のスクリプトで使うときに長い名前表示は必要ないから淡白にしといていい。

linuxがちゃんと稼働しているかどうかのプロセス確認

昔はinitとsshdとかを確認してた。

そういえばxinetdなんてのもあったな。
メモリ貧乏な時代に、ポートにリクエストがあったら初めてデーモン起動するって動き方してたっけ。intel solarisに突っ込んだとき書いたはず。

ubuntu22としてはsystemd/sshd/cronあたりを確認する。

定義ファイルに候補を書いといて、チェック対象に@(1)って書いておく。
最終行にはそのサービスのバージョンが拾えるコマンドラインを書く。

nari@nafslinux-ubu22:/gvis/script/proc$ cat linux_chk.conf
#=======================#
# (1)   : Check Process #
# other : No Check      #
#=======================#
@(0) init
@(1) systemd
@(0) usb-storage
@(0) automount
@(1) sshd
@(0) xinetd
@(1) cron
lsb_release -d
nari@nafslinux-ubu22:/gvis/script/proc$

プロセスチェック対象を確認。

nari@nafslinux-ubu22:/gvis/script/proc$ chk linux lst

### linux Check Process List

systemd
sshd
cron

nari@nafslinux-ubu22:/gvis/script/proc$

実際にプロセスチェックさせてたとこ。

nari@nafslinux-ubu22:/gvis/script/proc$ chk linux
... linux CHECK END      Description: Ubuntu 22.04.1 LTS
nari@nafslinux-ubu22:/gvis/script/proc$

もしもプロセスが動いてなかったら、PROCESS_NOT_FOUNDが戻る。

sambaならsmbdとnmbd、apacheならapache2をプロセス確認させるように書いとく。

dockerの場合

1つだけプロセスチェックしてる。
シンプルでええなぁ。

nari@nafslinux-ubu22:/gvis/script/proc$ chk docker lst

### docker Check Process List

dockerd

nari@nafslinux-ubu22:/gvis/script/proc$

dockerコンテナ停止してプロセス停止したとき

いったんコンテナ停止してみる。
コンテナ停止は普通に停止してから、普段使ってないoracleとかpostgresqlとか入った全定義でのdocker-compose-ALL.ymlを使って停止させる。

nari@nafslinux-ubu22:/docker$ cat ./dockerStop.sh
#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :dockerStop.sh
##  Created by  : T.Naritomi
##          on  : 2019.08.07
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------

## ---detail----------------------------------------------------------------

DOCKER_ROOT=/docker

cd ${DOCKER_ROOT}
/usr/local/bin/docker-compose stop

cp -p docker-compose-ALL.yml docker-compose.yml
/usr/local/bin/docker-compose stop

exit
nari@nafslinux-ubu22:/docker$
nari@nafslinux-ubu22:/docker$ sh ./dockerStop.sh
[+] Running 10/10
 ? Container docker-cl_red8-1          Stopped                                      10.5s
 ? Container docker-sv_https-portal-1  Stopp...                                      3.7s
 ? Container docker-sv_web118-1        Stopped                                       0.6s
 ? Container docker-cl_red9-1          Stopped                                      10.4s
 ? Container docker-cl_ubu22-1         Stopped                                       0.6s
 ? Container docker-sv_php74-1         Stopped                                       0.2s
 ? Container svldap-admin              Stopped                                       0.6s
 ? Container svldap-server             Stopped                                       0.2s
 ? Container docker-sv_django-1        Stopped                                      10.2s
 ? Container docker-sv_mariadb-1       Stopped                                       1.0s
[+] Running 10/0
 ? Container docker-sv_web118-1        Stopped                                       0.0s
 ? Container docker-cl_red8-1          Stopped                                       0.0s
 ? Container docker-cl_ubu22-1         Stopped                                       0.0s
 ? Container docker-sv_https-portal-1  Stopp...                                      0.0s
 ? Container docker-cl_red9-1          Stopped                                       0.0s
 ? Container svldap-admin              Stopped                                       0.0s
 ? Container docker-sv_php74-1         Stopped                                       0.0s
 ? Container svldap-server             Stopped                                       0.0s
 ? Container docker-sv_django-1        Stopped                                       0.0s
 ? Container docker-sv_mariadb-1       Stopped                                       0.0s
nari@nafslinux-ubu22:/docker$

このときにonlchkしてみるとコンテナは全停止してるので1つも見えない。

nari@nafslinux-ubu22:/docker$ onlchk
... linux CHECK END      Description: Ubuntu 22.04.1 LTS
... httpd CHECK END      Server version: Apache/2.4.52 (Ubuntu)
... smb CHECK END        Version 4.15.9-Ubuntu
... docker CHECK END     Docker version 20.10.17, build 100c701
=== Google STATUS===
...rtx1210-status >
...rtx1210-status   Current status is disabled.
...Google -status
...Google -status jelly-fslinux us-east1-b e2-standard-8 192.168.100.218 104.196.198.226 TERMINATED
=== SSH Tunnel STATUS===
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022
=== Docker Container STATUS===
nari@nafslinux-ubu22:/docker$

次はdocker本体停止する。こっちはsystemctl使うからrootで動かす。
そういえばnkfなんてのもまだ入ってたな。もういらんかも。

root@nafslinux-ubu22:/gvis/script# cat 301_dockerStop.sh
## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2018.11.23
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------
###LANG=C
EXEC_HOME=/gvis/script                  # Execute Home directory

LOG_OUTPUTDIR=/gvis/log/300_docker.log

echo ${LOG_OUTPUTDIR}
echo -n `date +%F_%T_` >> ${LOG_OUTPUTDIR}
systemctl stop docker docker.socket
systemctl status docker | grep 'Active' | nkf -s >> ${LOG_OUTPUTDIR}
echo dockerStop  | nkf -s >> ${LOG_OUTPUTDIR}

exit $?

## ---example---------------------------------------------------------------
##
## -------------------------------------------------------------------------
root@nafslinux-ubu22:/gvis/script# sh ./301_dockerStop.sh
/gvis/log/300_docker.log
root@nafslinux-ubu22:/gvis/script#

停止させたときのエコーバック。

root@nafslinux-ubu22:/gvis/script# tail -4 /gvis/log/300_docker.log
2022-08-13_06:03:47_     Active: active (running) since Sat 2022-08-13 06:03:47 JST; 9ms ago
dockerStart
2022-08-13_06:14:00_     Active: inactive (dead) since Sat 2022-08-13 06:14:00 JST; 5ms ago
dockerStop
root@nafslinux-ubu22:/gvis/script#

ここでonlchkしたらdockerのプロセスあらへん、って答えが戻る。

nari@nafslinux-ubu22:/gvis/script/proc$ onlchk
... linux CHECK END      Description: Ubuntu 22.04.1 LTS
... httpd CHECK END      Server version: Apache/2.4.52 (Ubuntu)
... smb CHECK END        Version 4.15.9-Ubuntu
### ENVIRON[nafslinux-ubu22] : docker   dockerd PROCESS_NOT_FOUND
... docker CHECK END     Docker version 20.10.17, build 100c701
=== Google STATUS===
...rtx1210-status >
...rtx1210-status   Current status is disabled.
...Google -status
...Google -status jelly-fslinux us-east1-b e2-standard-8 192.168.100.218 104.196.198.226 TERMINATED
=== SSH Tunnel STATUS===
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022
=== Docker Container STATUS===
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
nari@nafslinux-ubu22:/gvis/script/proc$

プロセス確認は監視にも使える

運用チックな使い方の1つ。

onlchkを定期的に起動させて、プロセス停止の文言が戻ってたらメールさせる。
高価な監視ソフトウェアがなくても、たとえばcrontabで定義しといたらいい。

nari@nafslinux-ubu22:/gvis/script$ sudo crontab -l | grep 803_CHKonlchkStat.sh
[sudo] nari のパスワード:
06,16,26,36,46,56 6-21 * * * /bin/sh /gvis/script/803_CHKonlchkStat.sh  > /dev/null
nari@nafslinux-ubu22:/gvis/script$

さっき停止させたdockerの場合、こんなメールが来る。

---onlchk  result ---
### ENVIRON[nafslinux-ubu22] : docker    dockerd PROCESS_NOT_FOUND

803_CHKonlchkStat.shにはこう書いてる。
昔はsendmail使ってたのが、今は別でpostfixの設定してから使えるようにした。
LANG=Cをコメントにしてるのは、本文に日本語入っててもメールできるから。

nari@nafslinux-ubu22:/gvis/script$ cat 803_CHKonlchkStat.sh
## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2014.04.05
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------
###LANG=C
EXEC_HOME=/gvis/script                  # Execute Home directory
MAILMSG=${EXEC_HOME}/`basename $0`-report.txt   # report

MAIL_TO="xxxx@gavann-it.com"
MAIL_TITLE="auto)alertReport-onlchk-naFSlinux-Home"

rm -f $MAILMSG

# Report mail make--r--------------------------------------------#
echo "" >> $MAILMSG
echo "---onlchk  result ---" >> $MAILMSG
${EXEC_HOME}/proc/onlchk | grep 'PROCESS_NOT_FOUND' >> $MAILMSG


RES=`cat $MAILMSG | grep 'PROCESS_NOT_FOUND' | wc -l`

if [ $RES -ne 0 ]; then
        cat $MAILMSG | /usr/bin/mail -a "Content-Type: text/plain; charset=UTF-8" -s $MAIL_TITLE $MAIL_TO
        echo E-mail.
fi


exit $?

nari@nafslinux-ubu22:/gvis/script$

履歴みたいな使い方

onlchkを定期起動させて、メールで結果をレポートさせてる。

普段apt updateでバージョンを上げてくけど、「いつからこのバージョンやったかなぁ」とか考えることがたまにある。

メールでのレポートを検索すると、一番古いメールでは6月15日がdockerは20.10.17になってた。

---onlchk  result ---
... linux CHECK END     Description: Ubuntu 22.04.1 LTS
... httpd CHECK END     Server version: Apache/2.4.52 (Ubuntu)
... smb CHECK END     Version 4.15.9-Ubuntu
... docker CHECK END     Docker version 20.10.17, build 100c701

6月14日のレポート見たら、dockerは20.10.16になってるから、この日の日中か15日の朝にバージョン上げてるのがわかる。

---onlchk  result ---
... linux CHECK END     Description: Ubuntu 22.04 LTS
... httpd CHECK END     Server version: Apache/2.4.52 (Ubuntu)
... smb CHECK END     Version 4.15.5-Ubuntu
... docker CHECK END     Docker version 20.10.16, build aa7e414

あ、sambaもマイナーバージョンが5から9に上がってるし、ubuntu本体も22.04から22.04.1に上がってた。

一度は考えたjenkins

crontabでのスクリプト起動だけじゃなくて、jenkinsにも定期起動の機能がある。

jenkinsは直列の処理だけじゃなくて、並列処理が作れる。

GUI定義じゃなくてテキストを書く必要あるけど、ジョブネットみたいなことができるから、systemwalkerとかjp1なくても業務処理扱える。

jenkinsは本来はCIサーバとして、webとdbのコンテナを動的に作ってgitからソースとか取ってきてなんてことを並列稼働させて自動テストなんかに使う。

一回だけonlchk定期起動とかやってみたけど、javaが動くコンテナはもっさり、ゆっくり動いた。

コンテナで基盤的な処理を動かすのは、dockerで障害出た時ちゃんとレポートとかできないから、やっぱりやめた。

運用チックな処理は、ミドルウェアとか使わずOS機能だけで実現したほうがええ。

コメント

タイトルとURLをコピーしました