无效的id:进程泄露文件描述符。Jenkins

4

我已经搭建了一个 Jenkins CI 解决方案(在 Windows 上),其中包括 3 个并行作业(使用 Multijob 插件),它们将 git 仓库(使用 Git-plugin)检出到各自的工作区。 在大多数情况下,这些作业都能够完美地运行,但有时候一个或多个作业会出现以下错误信息:

Building on master in workspace C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace
Checkout:workspace / C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace - 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个回答

1
如果您查看您错误信息中提供的链接,您将找到三种解决此问题的详细示例:
  1. 'at'命令可以用来在后台启动进程。
  2. 使用包装脚本并通过其启动程序。
  3. 对于Windows XP及更高版本,则是安排永久任务并强制从ant脚本运行它。
编辑:
这个问题的原因已经被描述了。
Jenkins和子进程通过三个管道(stdin / stdout / stderr)相连。这使得Jenkins能够捕获子进程的输出。由于子进程可能会向管道中写入大量数据,然后立即退出,因此Jenkins需要确保在将构建视为结束之前,它已经排空了管道。Jenkins通过等待EOF来实现此操作。当这些文件描述符被继承到其他进程时,情况就变得复杂了。假设子进程将另一个进程fork到后台。后台进程(也称为守护进程)继承了父进程的所有文件描述符,包括连接子进程和Jenkins的stdout / stderr管道的写入端口。如果守护程序忘记关闭它们,即使子进程退出,Jenkins也无法获得管道的EOF,因为守护程序仍然保持这些描述符处于打开状态。这就是出现问题的原因。良好的守护程序会关闭所有文件描述符以避免出现此类问题(以便Jenkins可以读取EOF)
为了防止守护进程具有打开的文件描述符,一个进程(你的解决方法,可以是在后台运行的shell / windows脚本)将在后台运行,以确保在守护进程存在时,关闭所有文件描述符。

1
问题在于它在触发构建步骤之前就失败了。 - user2288008
1
很好,你引用了文档,虽然我已经这样做了)) 但我不明白如何进行修复。while daemon exists是什么守护进程?我没有运行任何程序。 - user2288008
1
所有描述的解决方案都需要可执行文件才能运行,而我没有。您能提供一步一步的解决方案,以便我可以尝试吗? - user2288008
很遗憾,我对Windows脚本没有任何了解!!!如果是Unix / Linux,您可以从CLI调用daemonize -E BUILD_ID = dontKillMe curl --user <your_jenkins_username>:<your_jenkins_API_key> http://<jenkins_server_url>/job/<your_jenkins_job_name>/build(未经测试)。 - Not a bug
1
这根本没有帮助。我有一个多平台构建,Linux和Mac都运行得很好。我只在Windows上遇到了这个问题。 - user2288008
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接