またまたシェルスクリプトネタなどを。
今回はtxtファイルの文字列を読み込んで配列に入れる処理ですね。
例えば
aaa
bbb
ccc
こんな文字列がテキストファイルに格納されていたとして、これを配列に格納する場合、下記のような処理になります。
1 2 |
DATA_LIST=` cat sample.txt ` DATA_ARR=( `echo ${DATA_LIST} `) |
普通のプログラムだとポインタを使って読み込むパターンが多いんですが、シェルならではですね・・・
これを利用して下記のような監視のシェルを書いてみました。
SSHキーでログインをして、プロセスが止まっていたらメールを送るスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/bin/bash #一連の処理の実行 cd /home/hogehoge/ #自動ログインのシェルを読み込む . autoLogin.sh #メール送信のシェルを読み込む . sendMail.sh #監視するサービスをテキストファイルに入れておく MONITORING_SERVICE_LIST=` cat monitoringServiceList.txt ` #そこから配列に読み込む MONITORING_SERVICE_ARR=( `echo ${MONITORING_SERVICE_LIST} `) TARGET_HOST='samplehost' SSH_PORT='port番号' USER_ID='ユーザーID' PASSWORD='パスワード' SSH_KEY='秘密鍵のパス' alert_message(){ ALERT_MESSAGE=`cat << EOS $1が止まっています。 EOS ` sendMailShell "hoge@sample.jp" "hoge@sample.jp" "【警告】$1 is stop!" "${ALERT_MESSAGE}" } #対象サービスのモニタリング for MONITORING_SERVICE in ${MONITORING_SERVICE_ARR[@]}; do #sshにログインしてログ出力 echo ${MONITORING_SERVICE} #実際に吐き出されるメッセージをみるとプロセス数は最後の1行のみ RUNNIBG_PROCESS=`auto_ssh ${TARGET_HOST} ${SSH_PORT} ${USER_ID} ${PASSWORD} ${SSH_KEY} "ps -ef | grep ${MONITORING_SERVICE} | grep -v grep | wc -l" | tail -1 ` if [[ $RUNNIBG_PROCESS < 1 ]];then alert_message "${MONITORING_SERVICE}" "${RUNNIBG_PROCESS}" fi done |
シェルでの注意ポイント
- ifでの数式は[[]]にしないと不等号が利かない
- http://sucrose.hatenablog.com/entry/2016/12/02/235207
- 実行時のメッセージは
で変数化できる。最終行を取りたいときはtail -1
参考リンク
配列の基本の参照について
シェルスクリプトの文字分割について