前提
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 grep
grep
無視実行するコマンド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
信号処理を送信し、この信号に応答するために必要な数に対応する処理が信号でN
、N
(システムを次のように別の値ですCentOS 7
)。
ここで開発者が一般的である9) SIGKILL
と15) 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
を組み合わせ、関連する文法、nohup
、ps
およびその他の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日)