嘗試使用 gitlab-runner 重新啟動 tomcat 8,創建了 pid 文件,日誌為空,伺服器未啟動
我正在嘗試在部署後重新啟動我的 tomcat 8 伺服器。
設置:
gitlab-runner 使用自己的使用者執行(稱為 gitlab-runner)
tomcat 使用自己的名為 tomcat 的使用者
- sudoers 有一個條目,以便 gitlab-runner 可以執行腳本:
gitlab-runner ALL=(tomcat) NOPASSWD: /home/tomcat/deploy.sh
- 部署腳本只是將文件複製到 webapps 目錄,關閉 tomact 並重新啟動它:
cd /home/tomcat/bin sh catalina.sh stop -force ... sh catalina.sh start
當我以 gitlab-runner 使用者身份手動執行腳本時,一切正常:
sudo -u tomcat /home/tomcat/deploy.sh
但是,當從 gitlab-ci-multi-runner 啟動作業(推送到 gitlab 儲存庫)時,會發生以下事情。gitlab-runner 基本上編寫了一個 script.sh,然後從上面執行相同的命令。
- 通常當我啟動 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.
顯示。
- 創建了一個 pid 文件,其中包含一個 pid,但該程序不存在。
- 日誌文件已創建,但它們是空的。
如果我以調試模式啟動伺服器:
sh catalina.sh jpda start
文件 log/catalina.out 僅包含一行:tomcat Listening for transport dt_socket at address: 8080
我的想法是環境不同,所以我檢查了
env
cmd。一切都是平等的,除了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都會繼續執行。