一、全部代碼?
#!/bin/bash
DATE=$(date +%Y%m%d)SOURCE="abc.jar"
TARGET="backup/abc.jar.jew.$DATE"if [ -f "$SOURCE" ]; thencp "$SOURCE" "$TARGET"
firm -f abc.jar
mv abc_1.jar abc.jarpidNum=`ps -ef | grep $SOURCE | grep -v "grep"|awk '{print $2}'`
if [ "$pidNum" = "" ];thenecho "not"
elseecho "pid : $pidNum"kill -15 $pidNumecho "successfully"
finohup java -jar abc.jar > log.file 2>&1
二、分析
后端語言:java? ? ? ? 新jar包名字:abc_1.jar? ? ? ? 老jar包(被替換jar包):abc.jar
目的:首先判斷后端的abc.jar是否存在,如果存在,那就把這個jar復制并加當前時間命名后作為備份,放到備份文件夾里。刪除abc.jar,把新jar包abc_1.jar重命名為abc.jar。停掉進程后,重新啟動。
---------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
DATE=$(date +%Y%m%d)? ? ? ? #輸出當前日期,賦值給DATE變量,格式為20240627
SOURCE="abc.jar"? ? ? ? #當前jar名字賦值SOURCE變量
TARGET="backup/abc.jar.jew.$DATE"? ? ? ? #backup路徑下abc.jar加當前日期后綴,備份
if [ -f "$SOURCE" ]; then? ? ? ? #如果SOURCE存在(-f:判斷后邊的路徑是否是一個常規文件)
? ? cp "$SOURCE" "$TARGET"? ? ? ? #將SOURCE復制到TARGET,后綴有當前日期
fi? ? ? ? #語句結尾
rm -f abc.jar? ? ? ? #強制刪除abc.jar
mv abc_1.jar abc.jar? ? ? ? #將abc_1.jar重命名為abc.jar?
pidNum=`ps -ef | grep $SOURCE | grep -v "grep"|awk '{print $2}'`
#ps -ef :查看正在運行的所有進程的完整信息;|:在這個結果的基礎上;grep $SOURCE:查找文件里含有SOURCE(abc.jar)的信息;|:在這個結果的基礎上;grep -v "grep":查找并去掉含有grep的進程;|:在這個結果的基礎上;awk '{print $2}':格式化文本信息,輸出第二個字段值,也就是進程號,賦值給pidNum。
if [ "$pidNum" = "" ];then? ? ? ? #如果進程號為空
?? ?echo "not"? ? ? ? #輸出not,就證明當前沒有進程運行,可以直接啟動
else? ? ? ? #不為空,有進程運行
?? ?echo "pid : $pidNum"? ? ? ? #輸出進程號
?? ?kill -15 $pidNum? ? ? ? #退出進程
?? ?echo "successfully"? ? ? ? #提示退出進程成功
fi????????#語句結尾
nohup java -jar abc.jar > log.file 2>&1? ? ? ?
#nohup:確保進程登出或會話關閉后仍然運行java程序。java -jar abc.jar:運行java應用程序。 >:重定向輸出。log.file:將被重定向到的文件。 2>&1:將標準錯誤重定向到標準輸出的同一個地方(log.file),這樣就可以將錯誤和信息都記錄到同一個文件中。也可以最后多加一個&表示將命令放入后臺運行。
---------------------------------------------------------------------------------------------------------------------------------
三、關于2>&1的問題
2是標準錯誤輸入,1是標準輸出。>&是一個整體,不能分開使用,否則就不是這個含義了。
還有 log.file、2、1的排列順序,不能打亂:
> log.file 2>&1 含義:1本來指向屏幕,執行> log.file,1指向 log.file;執行2>&1,2指向1,而1指向 log.file,所以1和2都指向log.file。此時1和2都指向log.file。
2>&1 > log.file 含義:1本來指向屏幕,執行2>&1,2指向1,而1指向屏幕,所以1和2都指向屏幕;執行> log.file,1指向log.file。此時只有1指向了log.file。(所以這樣就會導致有錯誤輸出的時候log.file沒有記錄!!!)