原標題: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 有什麼不一樣?