jenkins 部署 swoole 項目

原標題:ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,000php

————————————————————————————————————————————shell

最近 ,用 swoole 搞了個服務端項目,之前都是 php-fpm 項目,服務器

此次不一樣的是要有本身的啓動腳本了。。。swoole

 

而後也想用 jenkins 實現自動部署,因而問題來了,當 jenkins 執行完全部命令後並無終止,而是:ssh

 一直轉圈  其實已經執行完了。php-fpm

 

出現這種狀況應該是 jenkins 沒法判斷命令是否執行完成,因而各方搜索,有說是命令最後要經過 測試

exit 0 表示成功,exit 1 表示失敗ui

經測試 無效。。。rest

 

後來找到了這個解釋:進程

Since you are executing a script from a non-TTY environment; The Jenkins is not able to get the exit properly, out of your script.(https://stackoverflow.com/questions/11290540/jenkins-text-finder-unable-to-success-my-build/22011893#22011893

大概是:你在一個non-TTY環境執行腳本,致使 jenkins 不能正確的獲得你的腳本的 exit 從而退出腳本

解決辦法是 :

點擊高級選項

給 pty 打上勾;

果真問題解決。。。

 

可是,爲何會出現這個問題還沒搞清楚,由於以前的 php-fpm 項目都不須要勾這個,二者之間的主要區別就是:

以前是:service php-fpm restart

個人是:sh start.sh ;  sh stop.sh

難道是系統 service 有什麼不一樣?

 

-----------------------次日更新------------------------

使用了 pty 又有一個新問題,個人主進程使用swoole_process::daemon 實現了守護進程,當 jenkins 的 pty 退出後 依然在運行,但是主進程啓動的兩個子進程死掉了。。。

後來把子進程也作成守護進程 仍是不行,

後來發現swoole 的daemon 會從新 fork當前進程,網上有說從新 fork 就和當前會話脫離關係了,會話結束時就不會結束進程(可是守護進程原本不就是幹這個事兒的麼 ?),

因而我猜想問題可能在於 個人swoole_process::daemon調用在主進程的最後 即啓動子進程以後,這樣子進程就是 fork 以前的主進程啓動的和會話沒有脫離關係(可是網上有這樣的說法:「由於shell只認識它本身fork出來的子進程,並不知道"子又生孫"的事情,也就不會給孫子進程發送SIGHUP信號了;」 )?

又因而 我把swoole_process::daemon放到了最開始 果真問題解決!!

後面還有個小問題 :有必定機率服務起不起來,應該是主進程 fork 以後,pty 沒有等到它執行完成?因而在最後加 sleep 1 問題解決了。。。

 

如今問題是解決了,可是裏面的原理比沒有十分清楚,

父進程、子進程、tty、pty、守護進程 它們之間的關係或協做關係還有待進一步研究,

按網上的說法  ssh 登陸服務器應該也屬於 pty ,可是我 ssh 等服務器啓動個人服務 再退出也是沒有問題的,不知道 jenkins 的 pty 有什麼不一樣? 或者 jenkins 勾選和不勾選 pty 有什麼不一樣?

相關文章
相關標籤/搜索