无效id:进程泄漏的文件描述符.詹金斯



我已经设置了一个Jenkins CI解决方案(在Windows上)由3个并行作业(使用Multijob插件)组成,其中checkout一个git存储库(使用git -plugin)到各自的工作区。95%的情况下,作业运行良好,但有时我在一个或多个作业中得到以下错误消息:

Building on master in workspace C:Program Files (x86)JenkinsjobsPatchsetCPPCheckworkspace
Checkout:workspace / C:Program Files (x86)JenkinsjobsPatchsetCPPCheckworkspace - hudson.remoting.LocalChannel@1a046fe
Using strategy: Gerrit Trigger
Last Built Revision: Revision 2ff5e3449041916e21fe7a4833a2babcfef45225 (master)
Fetching changes from 1 remote Git repository
Fetching upstream changes from origin
Commencing build of Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master)
Checking out Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master)
Cleaning workspace
Resetting working tree
FATAL: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
java.lang.IllegalArgumentException: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
    at org.eclipse.jgit.lib.ObjectId.fromString(ObjectId.java:232)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.doRevList(CliGitAPIImpl.java:1278)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.revList(CliGitAPIImpl.java:1264)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.isCommitInRepo(CliGitAPIImpl.java:1289)
    at hudson.plugins.git.GitAPI.isCommitInRepo(GitAPI.java:189)
    at hudson.plugins.git.GitSCM.computeChangeLog(GitSCM.java:1286)
    at hudson.plugins.git.GitSCM.access$1300(GitSCM.java:57)
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1251)
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1205)
    at hudson.FilePath.act(FilePath.java:905)
    at hudson.FilePath.act(FilePath.java:878)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1205)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1369)
    at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:676)
    at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:581)
    at hudson.model.Run.execute(Run.java:1593)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:242)
有谁能帮我一下吗?

如果您检查错误信息中给出的链接,您将找到三个解决此问题的详细示例,

  1. 'at'命令可以在后台启动一个进程。
  2. 使用包装器脚本并通过它启动程序。
  3. 对于Windows XP和更高版本是安排永久任务和力从ant脚本中运行它。

编辑:

描述了这个问题的原因,

Jenkins和子进程通过三个管道连接(stdin、stdout和stderr)。这允许Jenkins捕获从子进程。因为子进程可能会写入大量的数据在那之后,詹金斯需要确保在它认为建造结束之前就把管道排干了。Jenkins通过等待EOF来完成。

当这些文件描述符被继承时,就会发生复杂的情况其他进程。假设子进程将另一个进程分叉到背景。后台进程(又名守护进程)继承所有的的文件描述符,包括连接子进程和Jenkins的stdout/stderr管道。如果守护进程忘记关闭它们,Jenkins甚至不会获得管道的EOF当子进程退出时,因为守护进程还有那些描述符。这就是问题发生的原因。

一个好的守护程序会关闭所有的文件描述符来避免这样的问题(这样jenkins就可以读取EOF)

为了防止守护进程打开文件描述符,一个进程(这是你的解决方案,可以是shell/windows脚本在后台运行)将在后台运行,以确保守护进程存在时,它关闭所有文件描述符

最新更新