cygwin update cause“错误:无法fork子进程:资源暂时不可用。”

时间:2016-04-04 09:34:36

标签: windows bash cygwin

我在Windows 7上使用setup-x86_64.exe工具(版本2.873)更新了我的cygwin。 我需要安装一些额外的软件包(主要是zip / unzip等)。

从那时起,当我尝试运行Cygwin终端时,我遇到以下错误(快捷方式指向C:\ cygwin64 \ bin \ mintty.exe -i /Cygwin-Terminal.ico - ):

Error: could not fork child process: Resource temporarily unavailable.  
DLL rebasing may be required. See 'rebaseall / rebase --help'.

Screenshot

我在网上搜索了如何运行他们在邮件中建议的rebaseall命令。基本上建议是启动cygwin / bin / dash.exe并运行:
bin/rebaseall 我做了几次,我也使用了-v注释,没有错误回来。我仍然无法启动cygwin。

我也尝试过运行cygwin-x / XWin-server没有任何反应。

我查看了cygwin/var/log/setup.log中的设置日志,我看不到任何错误。

我尝试再运行一些安装程序,重新安装我已经拥有的一些软件包,但这些软件包都没有帮助。 任何想法我怎么能让它工作?

12 个答案:

答案 0 :(得分:5)

我的一位同事在从SourceTree(Mingw32)打开终端时遇到了类似的错误,并且在尝试pullrebase等时遇到了错误(任何不是本地的)。他通过卸载Sourcetree解决了这个问题,使用CCleaner清理他的注册表(不确定是否需要),重新启动并再次安装Sourcetree。

我知道这与OP描述的问题略有不同,但是仍然可以通过取消/重新安装和清理注册表来解决这个问题,这也可能有助于未来的人们在Sourcetree问题上找到这个问题(比如我做了。)

修改: 另一位同事也遇到了这个问题,他设法修复它只是重新启动而没有重新安装或使用CCleaner。

答案 1 :(得分:3)

来自https://chromium.googlesource.com/chromium/src/+/master/docs/cygwin_dll_remapping_failure.md

处理rebaseall的重复失败以允许cygwin重映射

有时,cygwin无法控制的DLL会被映射到cygwin cygwin为其库选择的位置的进程。 这主要见于反病毒DLL。发生这种情况时, 必须在rebase期间指示cygwin以避开该区域 该DLL映射的内存。

背景

有一些背景可供选择 http://www.dont-panic.cc/capi/2007/10/29/git-svn-fails-with-fatal-error-unable-to-remap/

由于unix fork语义(大概),cygwin库必须是 映射到fork的父级和子级中的相同位置。所有 cygwin库中有关于它们应该映射到何处的提示 在进程地址空间;如果遵循这些提示,每个 库将映射到两个地址空间中的相同位置。 但是,Windows非常乐意将DLL映射到任何地方 地址空间;提示不被视为控制。重新映射 当cygwin进程启动时,会出现错误并且其中一个库 无法映射到其提示指定的位置。

/ usr / bin / rebaseall更改了所有cygwin的DLL提示 图书馆,以便没有图书馆间的冲突;它做到了这一点 通过选择连续但不重叠的库布局开始 在一个基地址和工作。这个过程确保有 没有内部的cygwin冲突,但无法应对冲突 cygwin进程地址空间中的外部DLL (例如反病毒DLL)。

要处理这种情况,你需要找出问题所在 非cygwin库,它在地址空间中,并执行 全部重新设置,以便没有cygwin提示将地图库映射到该位置。

详细

  • 从中下载ListDLLs可执行文件 sysinternals
  • 在运行某些cygwin命令时以管理员身份运行它。
  • 扫描cygwin进程的输出(可通过命令识别)和 该进程中的DLL看起来不像cygwin DLL(如AV)。注意 这些库的位置(通常只有一个)。
  • 选择低于起始地址的地址空间位置。
  • 退出所有cygwin进程。
  • 以管理员身份运行Windows命令shell
  • cd in \ cygwin \ bin
  • 运行ash /usr/bin/rebaseall -b <base address>(此命令也可以执行 如果要查看DLL布局,请-v标记。)

这应该解决问题。

rebaseall

失败

如果你选择的基地址太低,你最终可能会遇到一个破碎的cygwin 安装。您可以通过再次运行cygwin的setup.exe重新安装它 包选择页面,单击“全部”条目重新安装。你可能不得不这样做 这样做两次,因为你可能会在第一次重新安装过程中遇到错误。

答案 2 :(得分:2)

最近我一直在遭遇类似的问题。我无法确定原因,无论是由于最近的Windows7补丁还是最新的cygwin更新。我处于严格控制的企业环境中,只有有限的提升权限,许多反恶意软件和加密驱动器。我目前正在使用32位Cygwin。

在我安装Git和Git-Svn软件包之后开始出现问题,这些软件包需要Perl并升级其他各种Cygwin软件包。

使用rebase-trigger或rebaseall重新绑定并没有为我解决问题。在尝试执行rebase时,也没有在安装后的pahse中重新安装和设置重复引发的错误。

我的第一个成功是将Perl降级到以前的版本,即。从5.22.2.1降至5.22.1.2。几周后,错误返回,可能是在强制Windows更新和重新启动之后。

我最近的成功是通过忽略dash / rebaseall脚本并直接运行rebase.exe来实现的,如下所示: -

  1. 创建一个文件,列出/ bin目录中除cygwin1.dll和cyglsa.dll之外的所有cygwin .dll。 $ cd /bin $ ls -1 *.dll | egrep -v '(cygwin1|cyglsa).*\.dll' >rebasedlls.txt
  2. 关闭所有cygwin终端,如果您正在运行任何使用cygwin的服务,请确保它们也已停止。如有必要,请检查TaskManager并终止进程。
  3. 打开cmd.exe窗口(可能有助于使用您可以提升的任何提升权限),更改为cygwin / bin目录的Windows路径(即cygpath -wa /bin的Windows目录)。
  4. 直接使用rebase.exe查找cygwin1.dll文件的基地址:
  5. C:\apps\cygwin\bin> rebase.exe --info cygwin1.dll /usr/bin/cygwin1.dll base 0x61000000 size 0x00500000

    1. 使用该基地址和大小作为指导我选择下一个整数值作为我的rebase基地址 0x62000000 。没有特别的原因,只是预感。 (rebaseall脚本使用0x70000000)。
    2. 使用rebase.exe修复步骤(1)中文件中列出的所有.dll:
    3. C:\apps\cygwin\bin> rebase -b 0x62000000 -4 -n -v -t -T rebasedlls.txt

      到目前为止,非常好,我的Cygwin又回到了工作状态。

答案 3 :(得分:1)

这是修复。

  1. 转到Windows Defender安全中心设置
  2. 点击App&amp;浏览器控制
  3. 在底部点击&#34;漏洞利用保护设置&#34;链路
  4. 转到&#34;程序设置&#34;然后单击&#34;添加程序到 定制&#34; - &GT; &#34;选择确切的文件路径&#34;
  5. 导航到&#34; C:\ Program Files \ Git \ usr \ bin \ sh.exe&#34;并添加它
  6. 覆盖并关闭以下内容:强制ASLR,随机化内存分配(自下而上ASLR)
  7. 点击&#34;申请&#34;现在一切都应该可以正常工作。
  8. 还要从同一文件夹添加这些其他二进制文件:expr.exe,uname.exe,grep.exe,rm.exe

    祝你好运,
    加布里埃尔

答案 4 :(得分:0)

有一个rebase实用程序可以在设置后阶段触发rebase。

从破折号或bash:

/usr/bin/rebase-trigger full

关闭所有进程并再次运行setup-x86_64.exe。

答案 5 :(得分:0)

卸载它, 并安装32位软件。

答案 6 :(得分:0)

我重新启动了3次,然后一切正常。 wtf Windows 7

答案 7 :(得分:0)

这个完全相同的错误消息有多种原因,虽然与我在这种情况下也看到的一样,但并非都是与setup-x86_64.exe有关。但是,如果rebaseall不能解决您的问题,那么这里的建议可能会起作用。

在我今天早上看到的情况下,原来是由退出薄荷终端仿真器后继续运行的几个进程引起的。我的直觉是这些僵尸进程会阻止控制台被回收。就我而言,这两个过程是通过实验确定的,方法是查看不再需要的杂散过程的运行过程列表。通过查看正在运行的任务列表,我发现阻止我的两个过程。

C:\WINDOWS\system32>tasklist | grep Console

CobraWinLDTP.exe             31844 Console                    1     43,600 K
geckodriver.exe              52640 Console                    1     32,164 K

C:\WINDOWS\system32>taskkill /F /PID 31844
SUCCESS: The process with PID 31844 has been terminated.

C:\WINDOWS\system32>taskkill /F /PID 52640
SUCCESS: The process with PID 52640 has been terminated.

在其他一些stackoverflow问题上,我看到git通常是导致此症状的僵尸进程(对于某些用户)。不幸的是,关闭控制台会话后仍然存在的任何残留过程都可能导致此问题,因此您必须进行试验。

答案 8 :(得分:0)

  1. 转到任务管理器
  2. 杀死“ Git for Windows”进程
  3. 重新打开git bash

似乎一切正常。

注意:如果找不到“ Git for Windows”进程,而仍然要面对相同的进程,则直接终止“ Node.js:服务器端JavaScript”进程

答案 9 :(得分:0)

我具有对PC的管理员访问权限。对我来说,解决方案是以管理员身份运行Cygwin会话-右键单击该图标,以管理员身份运行,如下所示:

enter image description here

第一次以管理员身份运行后,新的Cygwin会话就轻松启动了。

答案 10 :(得分:0)

如果您已在Windows安全漏洞利用保护中打开Force randomization for images (Mandatory ASLR),则可以通过选择Use default (Off)来解决此问题,将其关闭。

答案 11 :(得分:0)

我遇到此问题的实例还与在 Windows 安全漏洞利用保护设置中打开“图像的强制随机化”有关。

在您将设置更改回默认关闭位置并重置后,您必须以管理员身份运行 Git 才能实现显然需要提升权限的目录更改。

我无法确定一种方法来允许打开该设置并且不会在 Git 上遇到此问题,尽管我尝试了一段时间但没有成功。

关闭可选的安全功能以让单个程序运行对我来说似乎是最后的选择。然而,这也不仅仅是任何程序。