Tomcat

嘗試使用 gitlab-runner 重新啟動 tomcat 8,創建了 pid 文件,日誌為空,伺服器未啟動

  • May 19, 2017

我正在嘗試在部署後重新啟動我的 tomcat 8 伺服器。

設置:

gitlab-runner 使用自己的使用者執行(稱為 gitlab-runner)

tomcat 使用自己的名為 tomcat 的使用者

  1. sudoers 有一個條目,以便 gitlab-runner 可以執行腳本: gitlab-runner ALL=(tomcat) NOPASSWD: /home/tomcat/deploy.sh
  2. 部署腳本只是將文件複製到 webapps 目錄,關閉 tomact 並重新啟動它:

cd /home/tomcat/bin sh catalina.sh stop -force ... sh catalina.sh start

當我以 gitlab-runner 使用者身份手動執行腳本時,一切正常:

  1. sudo -u tomcat /home/tomcat/deploy.sh

但是,當從 gitlab-ci-multi-runner 啟動作業(推送到 gitlab 儲存庫)時,會發生以下事情。gitlab-runner 基本上編寫了一個 script.sh,然後從上面執行相同的命令。

  1. 通常當我啟動 tomcat 時,我會看到以下輸出: 對於關機:

Using CATALINA_BASE: /home/tomcat/ Using CATALINA_HOME: /home/tomcat/ Using CATALINA_TMPDIR: /home/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /home/tomcat/bin/bootstrap.jar:/home/tomcat/bin/tomcat-juli.jar Using CATALINA_PID: /home/tomcat/bin/catalina.pid

對於啟動: Using CATALINA_BASE: /home/tomcat/ Using CATALINA_HOME: /home/tomcat/ Using CATALINA_TMPDIR: /home/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /home/tomcat/bin/bootstrap.jar:/home/tomcat/bin/tomcat-juli.jar Using CATALINA_PID: /home/tomcat/bin/catalina.pid Existing PID file found during start. Removing/clearing stale PID file. Tomcat started.

當我使用 gitlab-runner 啟動它時,沒有關閉輸出,但伺服器關閉。這實際上是有效的。

對於啟動只Tomcat started.顯示。

  1. 創建了一個 pid 文件,其中包含一個 pid,但該程序不存在。
  2. 日誌文件已創建,但它們是空的。

如果我以調試模式啟動伺服器:sh catalina.sh jpda start文件 log/catalina.out 僅包含一行:tomcat Listening for transport dt_socket at address: 8080


我的想法是環境不同,所以我檢查了envcmd。一切都是平等的,除了TERM=unknown它是由 gitlab-runner 啟動的。

您是否有任何線索可能會在後台發生什麼,或者只是我可以測試的事情?

gitlab-runner 是開源的,啟動建構腳本的腳本是這樣的:https ://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/executors/shell/executor_shell.go#L36

我終於想出了一個可行的解決方案。

對於不顯示環境變數的問題我參考這個:https ://bz.apache.org/bugzilla/show_bug.cgi?id= 37848 gitlab-runner沒有tty,所以沒有輸出顯示。

啟動故障的原因如下:查看 gitlab-runner 的原始碼,您可以找到:https ://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/executors /shell/executor_shell.go#L84

基本上,一旦 gitlab-runner 完成,它就會殺死所有剩餘的程序。這意味著在我的情況下,伺服器實際上在程序被殺死之前執行了很短的時間。這就是我得到空日誌文件的原因。

我通過簡單地編寫一個初始化腳本來啟動和關閉 tomcat 解決了這個問題。tomcat 現在有了自己的使用者(和組)。現在tomcat程序樹由/sbin/init啟動。現在 gitlab-runner 不再知道這個程序或者無法殺死它。無論哪種方式,在跑步者停止後,tomcat都會繼續執行。

引用自:https://serverfault.com/questions/726451