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}/_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機能だけで実現したほうがええ。
macでminikube使い始めた
minikubeはkubernetesのええ勉強になる。
kubectlのコマンドラインの練習ができるから、作ってくれた人はエラいなぁって思う。
自分はそんなんいちいち覚えたくないけど、こうしたら使えるっていうふうに思い出せるように運用スクリプト作った。
何となくやけど、minikube使ってる人の記事見たら、kubectlをkって名前のエイリアス定義して見える人がいた。
打鍵を素早く終わらせるためにやってるんやろけど、いちいち長いコマンドライン打つのは自分はイヤ。
バージョンやらpodの状態とかだけじゃなくて、ポートフォワードの状態とかも見たい。
kubectlが1.27のときのmac向けonlchkスクリプトはこんな感じ。
## ------------------------------------------------------------------------- ## Script Name : onlchk (for mac minikube) ## Created by : T.Naritomi ## on : 2023.07.27 ## Updated by : ## on : ## Parameters : ## Return Code : 0=Normal End ## Comments : ## ------------------------------------------------------------------------- ## ---detail---------------------------------------------------------------- echo '-------minikube status -------' minikube status | tail -5 echo '-------minikube check -------' minikube update-check echo '----- minikube verCheck ------' minikube config defaults kubernetes-version | head -3 echo '-------kubectl version -------' kubectl version --output=yaml | egrep 'clientVersion|serverVersion|gitVersion' echo '-------kubectl status -------' kubectl get po,svc echo '-------kubectl PV -------' kubectl get pv | awk '{ print $1,$2,$3,$5} ' echo '-------kubectl forward -------' ps -efww | grep kubectl | grep forward | awk '{ print $9,$10,$11,$12,$13 }' exit $?
kubernetesクラスタとが1.27のときに使うと、こんな出力が出る。
kubectl versionは2つ出てるけど、1つ目はサーバ側で2つ目はクライアント側。
クライアント側だけっていうオプション(–clinent)はあったけど、サーバ側っていうのが見つけられんかった。
minikube dashboardでもブラウザ見たら状態はわかるけどイマイチやねんなぁ。
特に自分が見たいものを素早く見たいからこういうのを作る。
nari@gvis-mac ~ % onlchk -------minikube status ------- host: Running kubelet: Running apiserver: Running kubeconfig: Configured -------minikube check ------- CurrentVersion: v1.31.1 LatestVersion: v1.31.1 ----- minikube verCheck ------ * v1.27.3 * v1.27.2 * v1.27.1 -------kubectl version ------- clientVersion: gitVersion: v1.27.4 serverVersion: gitVersion: v1.27.3 -------kubectl status ------- NAME READY STATUS RESTARTS AGE pod/cl-ubun22-78cf4cff6-pz7dk 1/1 Running 0 30m pod/sv-django-685d8b8c78-8vghz 1/1 Running 0 30m pod/sv-https-portal-6dd4f47ccb-44cvg 1/1 Running 0 29m pod/sv-mariadb1011-7685f55777-q6s2t 1/1 Running 0 30m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d7h service/sv-django ClusterIP 10.108.42.23 <none> 38080/TCP 5d10h service/sv-https-portal ClusterIP 10.97.128.229 <none> 30080/TCP,30443/TCP 5d10h service/sv-mariadb1011 ClusterIP 10.108.18.160 <none> 13306/TCP 5d10h -------kubectl PV ------- NAME CAPACITY ACCESS RECLAIM gvis-pv-django-sslcerts 1Gi RWO Bound gvis-pv-django-uwsgi-nginx 1Gi RWO Bound gvis-pv-mariadb1011 20Gi RWO Bound gvis-pv-mariadb1011conf 1Gi RWO Bound gvis-pv-ubun22 10Gi RWO Bound -------kubectl forward ------- port-forward --address 0.0.0.0 sv-mariadb1011-7685f55777-q6s2t 13306:3306 port-forward --address 0.0.0.0 cl-ubun22-78cf4cff6-pz7dk 33389:3389 port-forward --address 0.0.0.0 sv-django-685d8b8c78-8vghz 38080:8080 port-forward --address 0.0.0.0 sv-https-portal-6dd4f47ccb-44cvg 30443:443 nari@gvis-mac ~ %
ポートフォワードの状態があると、「開けてるポートどれやったっけ」がすぐに見れる。
永続化領域のPVもBoundになってるよなってのがわかる。
minikubeとかパッケージはbrew使って入れてて、brewで更新をときどきやってると、minikubeそのものもkuberctlもバージョンがコソっと上がってくる。
ときどき見落とすけど、minikube config defaults kubernetes-version
とかの結果を見ると、「あ、v1.27.3出てるやん!」とかして発見できる。
リリース予定どっかで見たんやけど、1.27が6月に出てるのにminikubeに反映されるのは翌月やったなぁ。
1.28は2023年のお盆の頃、ということはminikubeに反映されるのは彼岸の少し前ってことで、阪神ジャンプステークスの頃かいな。
brewでバージョン上がってたり、実行結果のminikube verCheck
の先頭のほうに新しいの発見したら、minikube deleteしてクラスタ作り直せしたろ。