web-dev-qa-db-ja.com

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のセットアップログを確認しましたが、エラーは表示されません。

すでに持っていたパッケージのいくつかを再インストールするために、セットアッププログラムをさらに数回実行しようとしましたが、どちらも助けにはなりませんでした。どのようにそれを機能させることができますか?

14
Charbel

私の同僚の1人は、SourceTree(Mingw32)からターミナルを開くときに同様のエラーがあり、pullrebaseなど(ローカルではないもの)をしようとするとエラーが発生しました。彼はSourcetreeをアンインストールし、CCleanerを使用してレジストリをクリーンアップし(これが必要かどうかはわかりません)、Sourcetreeを再起動してインストールしました。

私はこれがOPで説明されている問題とわずかに異なることを知っていますが、それはレジストリのアンインストール/再インストールとクリーニングによって解決できる可能性があり、これはSourcetree問題でこの質問を見つける将来の人々にも役立つかもしれません(私がしたように) 。

編集: 別の同僚にも問題があり、アンインストール/再インストールまたはCCleanerを使用せずに再起動するだけで問題を修正できました。

5
Svend Hansen

から https://chromium.googlesource.com/chromium/src/+/master/docs/cygwin_dll_remapping_failure.md

Cygwinの再マップを可能にするためにrebaseallの繰り返し失敗を処理する

Cygwinが制御できないDLLは、cygwinがライブラリ用に選択した場所のcygwinプロセスにマップされる場合があります。これは主にアンチウイルスDLLで見られます。これが発生した場合、リベース中にcygwinに指示して、DLLがマップされるメモリ領域を回避する必要があります。

バックグラウンド

この背景については、 http://www.dont-panic.cc/capi/2007/10/29/git-svn-fails-with-fatal-error-unable-で入手できますto-remap /

UNIXのフォークセマンティクス(おそらく)のため、cygwinライブラリは、フォークの親と子の両方の同じ場所にマッピングする必要があります。すべてのcygwinライブラリには、プロセスアドレス空間のどこにマップすべきかについてのヒントがあります。これらのヒントに従えば、各ライブラリは両方のアドレススペースの同じ場所にマッピングされます。ただし、Windowsは、アドレス空間の任意の場所にDLL; DLL $ ===をマッピングします。ヒントは制御と見なされません。cygwinプロセスが開始され、そのライブラリの1つがヒントで指定された場所。

/ usr/bin/rebaseallは、すべてのcygwinライブラリのDLLヒントを変更し、ライブラリ間の競合が発生しないようにします。これは、このプロセスは、Cygwin内の競合がないことを確認しますが、Cygwinプロセスのアドレス空間にある外部DLL(アンチウイルスDLLなど)との競合に対処することはできません。

このケースを処理するには、問題のある非cygwinライブラリが何であるか、アドレス空間のどこにあるかを把握し、cygwinヒントがライブラリをその場所にマップしないようにすべてリベースする必要があります。

詳細

  • ListDLLs実行可能ファイルを sysinternals からダウンロードします
  • Cygwinコマンドの実行中に管理者として実行します。
  • Cygwinプロセス(コマンドで識別可能)およびcygwin DLLのように見えない(AVのような)そのプロセス内のDLLの出力をスキャンします。これらのライブラリの場所に注意してください(通常は1つだけです)。
  • 開始アドレスよりも低いアドレススペースの場所を選択します。
  • すべてのcygwinプロセスを終了します。
  • 管理者としてWindowsコマンドシェルを実行する
  • \ cygwin\binのcd
  • 実行ash /usr/bin/rebaseall -b <base address>(このコマンドは-vフラグDLLレイアウト)を表示する場合。

これで問題が解決するはずです。

リベースオールに失敗しました

低すぎるベースアドレスを選択すると、cygwinのインストールが破損する可能性があります。 cygwinのsetup.exeを再度実行し、パッケージ選択ページで[すべて]エントリをクリックして再インストールすると、再インストールできます。最初の再インストールパスでエラーが発生する可能性があるため、これを2回行う必要があります。

3
gavenkoa

これが修正です。

  1. Windows Defenderセキュリティセンターの設定に移動します
  2. App&Browser Controlをクリックします
  3. 下部にある[エクスプロイト保護設定]リンクをクリックします
  4. 「プログラム設定」に移動し、「カスタマイズするプログラムを追加」をクリックします->「正確なファイルパスを選択します」
  5. 「C:\ Program Files\Git\usr\bin\sh.exe」に移動して追加します
  6. 次をオーバーライドしてオフにします。必須ASLR、メモリ割り当てのランダム化(ボトムアップASLR)
  7. [適用]をクリックすると、すべてが正常に機能するようになります。

また、同じフォルダーからこれらの他のバイナリーを追加します:expr.exe、uname.exe、grep.exe、rm.exe

幸運を、
ガブリエル

2
Gabriel Bercea

私は最近、同様の問題に苦しんでいます。最新のWindows7パッチまたは最新のcygwinの更新が原因であるかどうかにかかわらず、原因を特定できませんでした。私は厳しく管理された企業環境にいますが、昇格した権限は限られ、マルウェア対策や暗号化されたドライブがたくさんあります。現在、32ビットのCygwinを使用しています。

私にとっての問題は、GitおよびGit-Svnパッケージをインストールした後に始まりました。これにはPerlが必要で、他のさまざまなCygwinパッケージもアップグレードされました。

Rebase-triggerまたはrebaseallを使用してリベースしても問題は解決しませんでした。また、再インストールとセットアップは、リベース自体を実行しようとしたときに、インストール後のフェーズで繰り返しエラーを発生しませんでした。

私の最初の成功は、Perlを以前のバージョンにダウングレードすることでした。 5.22.2.1から5.22.1.2まで。数週間後、おそらく強制的なウィンドウの更新と再起動後にエラーが返されました。

私の最新の成功は、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ディレクトリ(つまり、cygpath -wa /binのwindowsディレクトリ)のWindowsパスに変更します。
  4. Rebase.exeを直接使用して、cygwin1.dllファイルのベースアドレスを見つけます。

C:\apps\cygwin\bin> rebase.exe --info cygwin1.dll /usr/bin/cygwin1.dll base 0x61000000 size 0x00500000

  1. そのベースアドレスとサイズをガイドとして使用して、リベースベースアドレスとして次の値全体を選択しましたx620000。これには特別な理由はありません。ただの予感です。 (rebaseallスクリプトは0x70000000を使用します)。
  2. Rebase.exeを使用して、手順(1)のファイルにリストされているすべての.dllを修正します。

C:\apps\cygwin\bin> rebase -b 0x62000000 -4 -n -v -t -T rebasedlls.txt

これまでのところ、非常に良いことですが、私のCygwinは再び稼働状態に戻りました。

2
Ed Randall

このまったく同じエラーメッセージにはさまざまな原因がありますが、すべてがsetup-x86_64.exeに関連しているわけではありませんが、そのコンテキストでも見ました。しかし、rebaseallで問題が解決しなかった場合、ここで提案する方法が有効かもしれません。

今朝見たケースでは、minttyターミナルエミュレータを終了した後も実行を続けていたプロセスがいくつかあったことが原因であることが判明しました。私の考えでは、これらのゾンビプロセスはコンソールのリサイクルを妨げます。私の場合、2つのプロセスは、不要になった浮遊プロセスの実行中プロセスのリストを確認することにより、実験的に決定されました。実行中のタスクのリストを確認することで、私をブロックしている2つのプロセスを見つけました。

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は多くの場合、この症状を引き起こすゾンビプロセスであることがわかりました(一部のユーザーにとって)。残念ながら、コンソールセッションが閉じられた後に残るプロセスはこの問題を引き起こす可能性があるため、実験する必要があります。

0
philwalk

3回再起動しましたが、その後は問題ありませんでした。 wtf Windows 7

0
Mladen

それをアンインストールし、32ビット用のソフトウェアをインストールします。

0
fxleyu

セットアップ後フェーズとしてリベースをトリガーするリベースユーティリティがあります。

ダッシュまたはバッシュから:

/usr/bin/rebase-trigger full

すべてのプロセスを閉じて、setup-x86_64.exeを再度実行します。

0
matzeri