我正在尝试通过重新启动使我的Python App工作的两个进程来完成远程部署。像这样
process-one &
process-two &
我试图通过这样做来“执行一个Shell脚本”
ssh -i ~/.ssh/id_... user@xxx.xxx ./startup.sh
我尝试过使用Jekins SSH Plugin和Publish Over SSH Plugin并做同样的事情。所有前面的步骤,停止进程,重新启动其他服务,拉入新代码工作正常。但是当我到达我开始服务的那一部分时。它执行这两行,并且插件或默认脚本执行都不能脱离服务器。它们都会挂起,直到我重新启动Jekins或者在发布通过SSH插件的情况下超时。所以我的构建需要重启Jenkins,或者标记为不稳定。
有没有人做过类似的事情?我试过了
nohup process-one &
但同样的事情发生了。并不是说服务也搞乱了,因为它们实际上是正常启动的,只是Jenkins似乎并不理解这一点。
非常感谢任何帮助。谢谢。
答案 0 :(得分:5)
生成的过程(即使使用&)消耗与ssh连接相同的输入和输出可能会发生什么。 Jenkins正在等待这些管道在作业关闭之前被清空,因此等待进程退出。您可以通过终止进程来验证,并且您将看到jenkins作业终止。
分离输出并远程启动流程
您的问题有多种解决方案:
(首选)使用正确的守护程序控制工具。您的目标平台可能有一种管理这些服务的标准方法,例如: init.d脚本。注意,在编写init.d脚本时,请确保在后台分离进程并确保守护程序的输入/输出与启动它们的shell分离。有几种技术,比如像http://www.unix.com/man-page/Linux/8/start-stop-daemon/工具,daemonize,daemontools或类似https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+as+a+Unix+daemon下描述的shell脚本(注意su -s bin / sh jenkins -c“你的命令; ... .disown“等)。我还列出了一些python特定的技术。
ssh服务器'程序< / dev / null> / dev / null 2>& 1&'
或
ssh服务器'程序< / dev / null>> logfile.log 2>& 1&'如果你想要原油输出管理(没有日志轮换等......)
可能使用setsid(我还没试过)https://superuser.com/questions/172043/how-do-i-fork-a-process-that-doesnt-die-when-shell-exits。在我的快速测试中,我无法让它工作......
Python守护程序
最初的问题主要集中在SSH上,所以我没有完全描述如何将python进程作为守护进程运行。这主要包含在其他技术中: