【问题标题】:start daemon on remote server via Jenkins SSH shell script exits mysteriously通过 Jenkins SSH shell 脚本在远程服务器上启动守护进程神秘地退出
【发布时间】:2013-05-16 02:18:08
【问题描述】:

我在 jenkins 上有一个构建作业,它正在构建我的项目,完成后,它会在远程服务器上打开一个 ssh shell 脚本并传输文件,然后停止并启动一个守护进程。

当我从 RHEL 服务器上的命令行停止和启动守护程序时,它执行得很好。当作业在jenkins中执行时,没有错误。

守护进程正常停止并正常启动。但在启动后不久,守护进程突然死亡。

sudo service daemonName stop
# transfer files.
sudo service daemonName start

我确定问题不在于路径

有谁知道 Jenkins 执行 ssh shell 脚本的方式有什么特别之处,会导致守护程序启动不完全完成?

【问题讨论】:

  • 你检查过日志吗?你在那里读到了什么错误?
  • 詹金斯日志?或控制台日志?还是守护进程的日志?控制台日志显示一切都成功了。守护进程的日志没有显示任何问题 jenkins 日志我怀疑会有帮助。
  • 也许守护进程没有被正确地守护,你有没有试过在 Jenkins 的 shell 脚本中添加一个sleep 10000 以查看在调用 shell 没有关闭时它是否运行更长时间?您是否尝试过比较 Jenkins 和 shell 中的 env 输出?如果它是一个本地守护进程,它可能会受到语言环境等因素的影响。

标签: shell ssh jenkins daemon


【解决方案1】:

Jenkins 监视作业产生的进程并杀死它们以避免僵尸进程。 见https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller

解决方法是覆盖BUILD_ID 环境变量:

BUILD_ID=dontKillMe

【讨论】:

  • 好的,我已经尝试过很多不同的化身,但它似乎不起作用。我尝试添加标志以关闭进程树杀手,我尝试更改我正在执行的 ssh 脚本中的构建 ID BUILD_ID=dontKillMe sudo service servicename start is in a "execute shell script on remote host over ssh “我做错了吗?
  • 好的,看来我误读了你的问题。进程三杀手仅在 jenkins 节点(或连接的 slave)上运行,而不在远程机器上运行,因此您的问题的根源必须在其他地方。
  • 很高兴您这样做了,您的回答解决了我一整天的头痛问题。谢谢=)
【解决方案2】:

问题: 通过jenkins执行构建时,启动守护进程的命令明明执行成功,但是构建完成后守护进程突然退出。

解决办法: 我一直认为是詹金斯杀死了守护进程。所以我尝试了许多不同的化身和排列来禁用 ProcessTree 模块,该模块通过并清理僵尸子进程。我试图通过重置 BUILD_ID 环境变量来欺骗它。没有任何效果。

感谢这个线程,我发现该解决方案仅适用于在 BUILD 机器上执行的子进程。 IE。不适用于我的问题。

更多搜索将我带到这里:Run a persistent process via ssh

解决方案?诺哈普。

所以现在构建通过执行以下命令成功地重新启动了守护进程: sudo nohup service daemonname start

【讨论】:

  • nohup 也救了我……但奇怪的是,当我在行尾附加 '&' 时它不起作用。我必须省略“&”才能使远程脚本调用正常工作。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2012-07-25
  • 2013-11-28
  • 1970-01-01
  • 2021-09-04
  • 2018-03-26
  • 2023-03-26
相关资源
最近更新 更多