再利用可能なのスクリプトアプリケーションの運用・保守を書くSpringBoot

前提

Java多くのシーンが使用され、開発者SpringBootの開発しWebたアプリケーションを、現在の主流のマイクロサービスのSpringCloud家族のバケットにも基づいているSpringBootビルド。SpringBootサーバーにデプロイされたアプリケーションは、スクリプトの操作および保守管理を記述する必要があります。前の経験、生産と要約の使用に基づいて本論文の試みShellスクリプトは、多重化して書き込むことができますSpringBoot大幅に削減するアプリケーションの運用・保守スクリプト、SpringBootアプリケーションの起動状態、リブート管理の作業負荷を。用紙Shell内のスクリプトCentOS7正常動作が、他のオペレーティングシステムは、適切ではないかもしれません。いくつかの基本的な原則のために興味を持っていないか、最後まで待つことができる場合は、スクリプトの直接コピーに使用します。

関連の知識に頼るシェル

書き込みSpringBootの基本的な操作やメンテナンスに加えて、アプリケーションスクリプトShellもアドレス2つの重要な問題(と思う)に必要な文法は比較的熟練しているよりも、:

  • ターゲット・アプリケーション・プロセス受ける権利ID獲得され、Process ID(以下PIDの質問)。
  • killジェスチャーコマンドの適切な使用。
  • コマンドnohupの適切な使用を。

取得PID

我々は成功したアプリケーション名を介して取得することができた場合、一般的に、PIDあなたはそれ以外のアプリケーション・プロセスが実行されていない、アプリケーション・プロセスが実行されているかを決定することができます。アプリケーションプロセスの状態を実行する基づいておりPID、そのアプリケーション・プロセス管理スクリプトが判断取得するために複数回呼び出すPIDコマンドのを。通常の状況下で使用することになるgrep見つけるためのコマンドをPID、たとえば、次のコマンドは、照会で、RedisサービスPID

ps -ef |grep redis |grep -v grep |awk '{print $2}'
复制代码

実際には、これは複雑なコマンドで、各|バックは、完全なスタンドアロンのコマンドは、次のとおりです。

  • ps -efされるpsと、コマンド-efのパラメータ、ps主に、プロセスのステータスを表示するために使用関連のコマンド-eのすべてのプロセスを代表して、および-fプロセス間の完全な出力表示の親子関係を表すには、例えば、以下は、仮想マシンの著者でCentOS 7実行ps -efした結果:

  • grep XXX実際には、grep対象のパラメータは、検索対象のパラメータの結果に対応し、前のコマンドで複雑なコマンドは、検索になります。
  • grep -v grepgrep無視実行するコマンドgrep自身のプロセスを。
  • awk '{print $2}'第二カラムは、治療の結果から取り出されます。

ps -ef |grep redis |grep -v grep |awk '{print $2}'複合コマンド実行プロセスは、次のとおりです。

  • <1>することによりps -ef、システムのプロセスの状態を取得します。
  • <2>スルーgrep redisからの<1>検索結果のredisキーワード、描画redisプロセス情報を。
  • <3>結果出フィルタ独自のプロセス。grep -v grep<2>grep
  • <4>結果の2列目の取得。awk '{print $2}'<3>

ではShellスクリプト、あなたが取得するために、このアプローチを使用することができますPID

PID=`ps -ef |grep redis-server |grep -v grep |awk '{print $2}'`
echo $PID
复制代码

しかし、これはある問題、あなたが取得するたびになりますPID、この非常に長いコマンド文字列、ビット不器用を使用する必要があります。使用可能なevalプロセスを簡素化するために:

PID_CMD="ps -ef |grep docker |grep -v grep |awk '{print \$2}'"
PID=$(eval $PID_CMD)
echo $PID
复制代码

取得PID問題はその後に基づき、解決PIDステップの操作方法についての決定があるかどうか。

killコマンドを理解します

killコマンドの一般的な形式はkill -N PID、本質的に、対応する機能であるにPID信号処理を送信し、この信号に応答するために必要な数に対応する処理が信号でNN(システムを次のように別の値ですCentOS 7)。

ここで開発者が一般的である9) SIGKILL15) SIGTERM次のようにそれらが一般的に記載されています。

シグナル番号 信号名称 説明 機能 影響を及ぼす
15 SIGTERM Termination (ANSI) システムは、対応するプロセス送信SIGTERM信号を プロセスは直ちに停止し、又は剥離リソース停止後、または待ち時間があるためIO、操作に続き、ブロッキングプロセスは、一般的に存在する、または別の角度から、それはプロセスであり、ブロックされた処理または無視することができるSIGTERM信号を
9 SIGKILL Kill(can't be caught or ignored) (POSIX) システムは、対応するプロセス送信SIGKILL信号を SIGKILLシグナルを無視することはできない、プロセスの全般的なパフォーマンスを直ちに停止する(もちろん、追加の事情があります)

なければ-N、引数killコマンドのデフォルトですkill -15一般的に、kill -9 PIDそれは手段がプロセスをkillであるが、プロセスの終了前にリソースを解放するプロセスに影響を与えたり、一時停止する可能性があるI/O異常なデータの損失やその他の問題によって引き起こされる動作を制御します。

nohupコマンド

アカウントのアプリケーションプロセスを終了するか、近くにしたい場合は、端末の後に終了しません、あなたは使用することができnohup、対応するプロセスを実行するコマンドを。

nohupはは何の頭文字手段を「中断されていない」、nohupは役割が保留中のコマンドを実行していないに変換ハングアップではありません。

nohupコマンドの形式は次のとおりです。nohup Command [Arg...] [&]機能は次のとおりです。コマンドに基づいてCommand、オプションの追加パラメータは、Argコマンドを実行し、すべて無視killハングアップ指令信号をSIGHUP&シンボルは、コマンドをバックグラウンドで実行する必要があることを示しています。

0:標準入力ストリームSTDIN 1:標準出力ストリームSTDOUT 2:標準エラーSTDERRオペレーティング・システムは3つの一般的な標準のストリームを持っていることをここで注意してください

直接実行nohup Command &し、標準出力ストリームとエラーストリームのすべてが、現在のディレクトリに出力されますnohup.outファイル、ディスクスペースの多くを取るためにつながる可能性があり、長い時間が、それは一般的に標準出力ストリームに必要とされSTDOUT、標準エラーストリームSTDERR例えば、他の文書にリダイレクトnohup Command 1>server.log 2>server.log &ただし、標準エラーストリームに起因するがSTDERR、この意志の原因はので、何のバッファではありませんserver.log、二回開かれ、標準出力とエラー出力につながることは互いにカバーと競合する、それは一般的に標準エラーストリームであるだろうSTDERR、標準出力ストリームにリダイレクトされ開かれていますSTDOUT、しばしば見られること2>&1、標準出力ストリームはSTDOUT省略されてもよい>上記1、これ:

nohupをコマンド1>のserver.log 2>のserver.log&修改为はnohupコマンド>のserver.log 2>&1&

しかし、より頻繁に展開されJavaたアプリケーションは、アプリケーションが容易にするために、特定のログのプリント・ツー・ディスクのディレクトリに専念されるときELK、同社の運用・保守要件に先立って、そのような著者として、コレクションをログに印刷されなければならない/data/log-center/${serverName}ディレクトリ、この時間がなければなりませんnohup標準出力ストリームSTDOUTと標準エラーストリームはSTDERR完全に無視します。より実現可能なアプローチは、これら二つの規格「ブラックホールにリダイレクトすべてのストリームにある/dev/nullで」。例えば:

コマンド>を/ dev / null 2>&1&nohupを

アプリケーション運用・保守スクリプト書かSpringBoot

SpringBootアプリケーションは基本的にあるJavaアプリケーションが、おそらく特定が追加されますSpringBoot許可パラメータを、運用および保守の以下の分析では、スクリプトの再利用可能な書き方をステップバイステップになります。

グローバル変数

再利用できる変数を考慮し、最初の抽出グローバル変数を再利用することができますスクリプトのシンプルさを向上させます。まず、定義JDKの位置をJDK_HOME

JDK_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/bin/java"
复制代码

これは、アプリケーションの位置を定義しますAPP_LOCATION

APP_LOCATION="/data/shell/app.jar"
复制代码

そして、アプリケーション名を定義しますAPP_NAME(主に検索および表示のために):

APP_NAME="app"
复制代码

そして、取得定義PID一時変数のコマンドPID_CMDの後ろに取得するために使用され、PID一時的な変数を:

PID_CMD="ps -ef |grep $APP_LOCATION |grep -v grep |awk '{print \$2}'"
// PID = $(eval $PID_CMD)
复制代码

仮想マシンのプロパティの定義VM_OPTS

VM_OPTS="-Xms2048m -Xmx2048m"
复制代码

定義されたSpringBoot属性SPB_OPTS(通常はアプリケーションを開始するようにポートを設定するために使用Profileまたは登録センターアドレスなど)を:

SPB_OPTS="--spring.profiles.active=dev"
复制代码

これらのパラメータは、主に、具体的には、実際のシーンに応じて変更または追加されました。

コアメソッドを用意し

サンプルスクリプトファイルがあるためにserver.sh、我々は最後に使用する必要がありますsh server.sh Command実行、Command下に記載されていました:

  • start:サービスを開始します。
  • info:印刷情報、コンテンツ共有が主な変数です。
  • status:サービスが実行されているかどうかを決定するためのサービスの状態を表示します。
  • stop:サービスプロセスを停止します。
  • restart:サービスを再起動します。
  • help:ヘルプガイド。

ここによるcase特定のキーワードとコマンドを実行するときに、最初のパラメータの入力を決定するためのメソッドを呼び出します。

start() {
 echo "start: start server"
}

stop() {
 echo "stop: shutdown server"
}

restart() {
 echo "restart: restart server"
}

status() {
 echo "status: display status of server"
}

info() {
 echo "help: help info"
}

help() {
   echo "start: start server"
   echo "stop: shutdown server"
   echo "restart: restart server"
   echo "status: display status of server"
   echo "info: display info of server"
   echo "help: help info"
}

case $1 in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status
    ;;
info)
    info
    ;;
help)
    help
    ;;
*)
    help
    ;;
esac
exit $?
复制代码

テスト:

[root@localhost shell]# sh server.sh 
start: start server
stop: shutdown server
restart: restart server
status: display status of server
info: display info of server
help: help info
......
[root@localhost shell]# sh c.sh start
start: start server
复制代码

次のアプローチは、実装に対応する必要があります。

INFOメソッド

info()主に複数の現在のサービスを変数情報環境とサービスを印刷するために使用されます。

info() {
  echo "=============================info=============================="
  echo "APP_LOCATION: $APP_LOCATION"
  echo "APP_NAME: $APP_NAME"
  echo "JDK_HOME: $JDK_HOME"
  echo "VM_OPTS: $VM_OPTS"
  echo "SPB_OPTS: $SPB_OPTS"
  echo "=============================info=============================="
}
复制代码

ステータス方法

status()この方法は、主に動作状態表示サービスのために使用されています。

status() {
  echo "=============================status==============================" 
  PID=$(eval $PID_CMD)
  if [[ -n $PID ]]; then
       echo "$APP_NAME is running,PID is $PID"
  else
       echo "$APP_NAME is not running!!!"
  fi
  echo "=============================status=============================="
}
复制代码

startメソッド

start()サービスを開始するために使用される主な方法は、あなたが使用する必要がありますJDKし、nohup他の関連するコマンド。

start() {
 echo "=============================start=============================="
 PID=$(eval $PID_CMD)
 if [[ -n $PID ]]; then
    echo "$APP_NAME is already running,PID is $PID"
 else
    nohup $JDK_HOME $VM_OPTS -jar $APP_LOCATION $SPB_OPTS >/dev/null 2>\$1 &
    echo "nohup $JDK_HOME $VM_OPTS -jar $APP_LOCATION $SPB_OPTS >/dev/null 2>\$1 &"
    PID=$(eval $PID_CMD)
    if [[ -n $PID ]]; then
       echo "Start $APP_NAME successfully,PID is $PID"
    else
       echo "Failed to start $APP_NAME !!!"
    fi
 fi  
 echo "=============================start=============================="
}
复制代码
  • まず、あなたがアプリケーション・プロセスに入ることができた場合、アプリケーションが既に、実行されているかどうかを判断PIDし、直接返します。
  • 使用nohupと併せて、コマンドをjava -jarアプリケーション起動するコマンドjarに基づいてパッケージ、PID正常に起動するか否かの判断を。

stopメソッド

stop()ここでの相対的な安全性のためと優雅にアプリケーションプロセスを終了するために使用される方法killのプロセスのうち、最初の使用kill -15方法は、決定kill -15プロセス、再利用を殺すことではありませんkill -9

stop() {
 echo "=============================stop=============================="
 PID=$(eval $PID_CMD)
 if [[ -n $PID ]]; then
    kill -15 $PID
    sleep 5
    PID=$(eval $PID_CMD)
    if [[ -n $PID ]]; then
      echo "Stop $APP_NAME failed by kill -15 $PID,begin to kill -9 $PID"
      kill -9 $PID
      sleep 2
      echo "Stop $APP_NAME successfully by kill -9 $PID"
    else 
      echo "Stop $APP_NAME successfully by kill -15 $PID"
    fi 
 else
    echo "$APP_NAME is not running!!!"
 fi
 echo "=============================stop=============================="
}
复制代码

再起動方法

実際には、まずstop()、それからstart()

restart() {
  echo "=============================restart=============================="
  stop
  start
  echo "=============================restart=============================="
}
复制代码

テスト

当社は、ベースきたSpringBoot信頼が唯一の導入spring-boot-starter-web、最も簡単な依存を打つJarパケットをapp.jar仮想マシン上の/data/shellディレクトリ、およびスクリプトをアップロードserver.shする/data/shellディレクトリ:

/data/shell
  - app.jar
  - server.sh
复制代码

次のように最初の試験結果は、次のとおり

[root@localhost shell]# sh server.sh info
=============================info==============================
APP_LOCATION: /data/shell/app.jar
APP_NAME: app
JDK_HOME: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/bin/java
VM_OPTS: -Xms2048m -Xmx2048m
SPB_OPTS: --spring.profiles.active=dev
=============================info==============================
......
[root@localhost shell]# sh server.sh start
=============================start==============================
app is already running,PID is 26950
=============================start==============================
......
[root@localhost shell]# sh server.sh stop
=============================stop==============================
Stop app successfully by kill -15 
=============================stop==============================
......
[root@localhost shell]# sh server.sh restart
=============================restart==============================
=============================stop==============================
app is not running!!!
=============================stop==============================
=============================start==============================
Start app successfully,PID is 27559
=============================start==============================
=============================restart==============================
......
[root@localhost shell]# curl http://localhost:9091/ping -s
[root@localhost shell]# pong
复制代码

確認テストスクリプトの実行結果が正しいです。これは=================、彼らが目障りを除去することができると感じた場合には、意図的に添加著者です。

概要

SpringBootそれは長い時間のために、現在または将来のあるWeb私は学ぶには少し時間がかかりました、メインフレームのサービスShellを組み合わせ、関連する文法、nohuppsおよびその他のLinux、再利用可能なのコマンドスクリプト記述されたアプリケーションの運用・保守をテストし、本番環境で使用されてきましたある程度、運用コストを節約できます。

参考文献:

付録

ここでserver.sh、スクリプトのすべての内容は:

#!/bin/bash
JDK_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/bin/java"
VM_OPTS="-Xms2048m -Xmx2048m"
SPB_OPTS="--spring.profiles.active=dev"
APP_LOCATION="/data/shell/app.jar"
APP_NAME="app"
PID_CMD="ps -ef |grep $APP_NAME |grep -v grep |awk '{print \$2}'"

start() {
 echo "=============================start=============================="
 PID=$(eval $PID_CMD)
 if [[ -n $PID ]]; then
    echo "$APP_NAME is already running,PID is $PID"
 else
    nohup $JDK_HOME $VM_OPTS -jar $APP_LOCATION $SPB_OPTS >/dev/null 2>\$1 &
    echo "nohup $JDK_HOME $VM_OPTS -jar $APP_LOCATION $SPB_OPTS >/dev/null 2>\$1 &"
    PID=$(eval $PID_CMD)
    if [[ -n $PID ]]; then
       echo "Start $APP_NAME successfully,PID is $PID"
    else
       echo "Failed to start $APP_NAME !!!"
    fi
 fi  
 echo "=============================start=============================="
}

stop() {
 echo "=============================stop=============================="
 PID=$(eval $PID_CMD)
 if [[ -n $PID ]]; then
    kill -15 $PID
    sleep 5
    PID=$(eval $PID_CMD)
    if [[ -n $PID ]]; then
      echo "Stop $APP_NAME failed by kill -15 $PID,begin to kill -9 $PID"
      kill -9 $PID
      sleep 2
      echo "Stop $APP_NAME successfully by kill -9 $PID"
    else 
      echo "Stop $APP_NAME successfully by kill -15 $PID"
    fi 
 else
    echo "$APP_NAME is not running!!!"
 fi
 echo "=============================stop=============================="
}

restart() {
  echo "=============================restart=============================="
  stop
  start
  echo "=============================restart=============================="
}

status() {
  echo "=============================status==============================" 
  PID=$(eval $PID_CMD)
  if [[ -n $PID ]]; then
       echo "$APP_NAME is running,PID is $PID"
  else
       echo "$APP_NAME is not running!!!"
  fi
  echo "=============================status=============================="
}

info() {
  echo "=============================info=============================="
  echo "APP_LOCATION: $APP_LOCATION"
  echo "APP_NAME: $APP_NAME"
  echo "JDK_HOME: $JDK_HOME"
  echo "VM_OPTS: $VM_OPTS"
  echo "SPB_OPTS: $SPB_OPTS"
  echo "=============================info=============================="
}

help() {
   echo "start: start server"
   echo "stop: shutdown server"
   echo "restart: restart server"
   echo "status: display status of server"
   echo "info: display info of server"
   echo "help: help info"
}

case $1 in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status
    ;;
info)
    info
    ;;
help)
    help
    ;;
*)
    help
    ;;
esac
exit $?
复制代码

個人のブログ

随時更新し、ちょうどアーキテクチャ、並行処理に有利になるように偏った、オリジナルの書き込み。

(本明細書で終わり、C-2-D EA-2020年3月1日)

おすすめ

転載: juejin.im/post/5e5bc2b4e51d45270b7d647d