1. 程式人生 > 其它 >linux主機通過ssh登入windows伺服器啟動tomcat所踩的坑

linux主機通過ssh登入windows伺服器啟動tomcat所踩的坑

情景描述

公司的Jenkins服務安裝在linux系統上,但是很多應用伺服器都是windows系統,那麼在jenkisn上編譯生成的war包如何傳輸到windows伺服器上並且進行tomcat服務的重啟呢?相對於linux的應用伺服器,使用jenkins在windows上做自動釋出還是遇到了一些不好解決的問題,windows系統在運維上還是有許多不便的(默默吐槽一句)。

釋出步驟

類比linux的應用伺服器,首選是通過ssh遠端登入的方式進行,這樣的話jenkins的配置都不需要怎麼更改,簡單的釋出步驟如下:

  1. jenkins中使用MAVEN編譯打包,生成所需的war包
  2. scp將war包傳輸到應用伺服器
  3. ssh遠端執行應用伺服器的部署重啟指令碼
  4. 釋出完成

windows預設是不支援ssh服務的,這裡我採用的是微軟官方的解決方案OpenSSH,安裝步驟可以參考:Windows安裝OpenSSH服務

遇到的問題

jenkisn遠端呼叫應用伺服器上的部署指令碼後,tomcat服務沒有啟動,但是在應用伺服器上手動執行指令碼是能夠完成專案的部署以及重啟的,通過除錯發現遠端呼叫bat指令碼確實將tomcat服務停掉並進行了重啟,但是隨著ssh連線的斷開,通過ssh啟動的程序也一同銷燬。
通過搜尋問題發現,在ssh到windows的情況下,只要ssh退出,ssh啟動的任務都會被kill掉。萬事具備,只欠重啟,這步實現不了,那之前的工作和沒有做一樣,沒辦法,只能找各種方案進行嘗試。

嘗試過的方案

防止jenkins殺掉程序

執行指令碼前增加 export BUILD_ID=notkillme,告訴jenkins任務結束後不要殺掉通過它啟動的程序。jenkins和tomcat在同一臺伺服器上可以實現,但這是ssh斷開的服務和jenkins無關。

shell指令碼

在windows 上安裝linux的shell環境,我是通過安裝一個git,然後將git的cmd和bin配置到環境變數path中來實現的。
shell中可以使用nohup命令啟動tomcat,nohup 命令會忽略所有結束通話(SIGHUP)訊號。在登出後使用 nohup 命令執行的程式不會登出,仍會執行。
但是ssh遠端啟動指令碼的情況下,ssh連線斷開,通過nohup啟動的服務也會登出

nohup ./startup.sh &  

將tomcat註冊為服務

通過將tomcat註冊成服務,在bat指令碼中通過服務的方式啟動,在ssh斷開之後服務能夠正常執行。

# 停止tomcat服務
net stop tomcat7
# 啟動tomcat服務
net start tomcat7

通過這種方式,能夠保證tomcat在ssh斷開後仍能夠執行,但是實踐中發現我們專案不止要使用tomcat,還依賴一些中介軟體,例如zookeeper,MQ等,他們在windows下不能被註冊為服務(zookeeper雖然可以註冊為服務,但是都不建議在生產環境執行),此種方式使用場景有限制。

呼叫windows上的執行計劃

在windows上建立一個執行計劃,執行計劃呼叫部署重啟的指令碼,ssh遠端啟動這個執行計劃,通過這種方式觸發的指令碼能夠保證在ssh斷開後,服務一直可以執行,和手動執行指令碼沒有區別,此方式實際專案中使用。

# 啟動名為DEPLOY的執行計劃
schtasks /Run /TN "DEPLOY"

本文來自部落格園,作者:風煙景,轉載請註明原文連結:https://www.cnblogs.com/wrxiang/p/15145273.html