原标题: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 有什么不一样?