原标题:ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,000
————————————————————————————————————————————
最近 ,用 swoole 搞了个服务端项目,以前都是 php-fpm 项目,
这次不同的是要有自己的启动脚本了。。。
然后也想用 jenkins 实现自动部署,于是问题来了,当 jenkins 执行完所有命令后并没有终止,而是:
一直转圈 其实已经执行完了。
出现这种情况应该是 jenkins 无法判断命令是否执行完成,于是各方搜索,有说是命令最后要通过
exit 0 表示成功,exit 1 表示失败
经测试 无效。。。
后来找到了这个解释:
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 有什么不同?