Bug #1872

[ruby_1_8] Kernel#system doesn't work in forked process

Added by Hidetoshi Nagai over 2 years ago. Updated 10 months ago.

[ruby-dev:38996]
Status:Closed Start date:08/04/2009
Priority:High Due date:
Assignee:Nobuyoshi Nakada % Done:

0%

Category:core
Target version:Ruby 1.8.8
ruby -v:ruby 1.8.8dev (2009-08-03 revision 24370) [i686-linux]

Description

OS 環境に依存している気もしないではないですが,
例えば次のような例が hang-up します.

$ ruby -e 'Process.fork{p system("ls")}'

Linux 2.6.15, glibc 2.3.3 における
ruby 1.8.8dev (2009-08-03 revision 24370) です.
configure オプションは --enable-pthread だけを与えています.

rb_f_system() 中の fork までは完了しており,
子プロセスは生成されてはいるものの,
生成直後に固まってしまっているようです.
親プロセスについては,子プロセスの ID を受け取り,
素直に動作して rb_syswait() に入っているように見受けられます.

なお,上記の例で system の代りに exec とした場合には
問題なく動作します.

Related issues

related to ruby-trunk - Bug #270: lazy timer thraed creation Closed
duplicated by Backport87 - Backport #2663: Hard hang (needs -9 to kill) in 1.8.7 build 248 Closed 01/27/2010

History

Updated by Kazuhiko Shiozaki over 2 years ago

Mandriva 2009.1 (glibc-2.9-0.20081113.5.1mnb2)では再現しませんでしたが、
Debian Ecth (libc6   2.3.6.ds1-13etch9) の環境で再現しました。
リビジョンを遡っていくと、 r23268 以降、発生する(ことがある)ようです。

    * eval.c (rb_thread_start_timer): guard condition was inverted. [ruby-dev:38319]

Updated by Hidetoshi Nagai over 2 years ago

永井@知能.九工大です.

From: "U.Nakamura" <usa@garbagecollect.jp>
Subject: [ruby-dev:39040] Re: [Bug #1872] [ruby_1_8] Kernel#system doesn't work in forked process
Date: Fri, 7 Aug 2009 21:22:11 +0900
Message-ID: <20090807211400.F038.C613B076@garbagecollect.jp>
> POSIX threadはよくわからないのですが、つらつら考えてみたとこ
> ろ、fork前にtimer threadを止めて、fork後に親子双方でまたtimer
> threadを動かせばいいんじゃないかという気がしてきました。
> 手元には環境がないのでかずひこさんに以下のパッチを試してもら
> ったところ、いちおう動くようになるみたいです。

私の環境ではダメでした.
パッチの適用前はゴミとして残るプロセス+スレッドが一つでしたが,
パッチの適用後は六つになりました.(^_^;
-- 
永井 秀利  (nagai@ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門

Updated by Kazuhiko Shiozaki over 2 years ago

> Mandriva 2009.1 (glibc-2.9-0.20081113.5.1mnb2)では再現しませんでしたが、
上記の環境でも、何百回と試してみると、2-5%程度の確率で失敗しました。
で、この環境でもなかむら(う)さん提案のパッチをあてると、失敗しなくなりました。

nadokaが--daemonで動かなかったりquickmlがささったりするのは困るので、
とりあえず--disable-pthreadでビルドして回避しています。

また、ruby-trunk (r.24372)ではどちらの環境でも再現しませんでした。

かずひこ

Updated by Usaku NAKAMURA over 2 years ago

こんにちは、なかむら(う)です。

In message "[ruby-dev:39039] [Bug #1872] [ruby_1_8] Kernel#system doesn't work in forked process"
    on Aug.07,2009 20:09:44, <redmine@ruby-lang.org> wrote:
> Mandriva 2009.1 (glibc-2.9-0.20081113.5.1mnb2)では再現しませんでしたが、
> Debian Ecth (libc6   2.3.6.ds1-13etch9) の環境で再現しました。
> リビジョンを遡っていくと、 r23268 以降、発生する(ことがある)ようです。
> 
>     * eval.c (rb_thread_start_timer): guard condition was inverted. [ruby-dev:38319]

r23268自体は正当な修正なので、要するに該当環境だとtimer thread
がいる時にforkするとまずいということなのでしょう。

POSIX threadはよくわからないのですが、つらつら考えてみたとこ
ろ、fork前にtimer threadを止めて、fork後に親子双方でまたtimer
threadを動かせばいいんじゃないかという気がしてきました。
手元には環境がないのでかずひこさんに以下のパッチを試してもら
ったところ、いちおう動くようになるみたいです。

わかる人や元のコードを書いた人(なかださんかな?)に発想が正しい
か考えてほしいのですが、どんなもんでしょうか...

Index: eval.c
===================================================================
--- eval.c	(revision 24389)
+++ eval.c	(working copy)
@@ -12485,7 +12485,7 @@ rb_thread_start_timer()
     safe_mutex_lock(&time_thread.lock);
     if (pthread_create(&time_thread.thread, 0, thread_timer, args) == 0) {
 	thread_init = 1;
-	pthread_atfork(0, 0, rb_thread_stop_timer);
+	pthread_atfork(rb_thread_stop_timer, rb_thread_start_timer, rb_thread_start_timer);
 	pthread_cond_wait(&start, &time_thread.lock);
     }
     pthread_cleanup_pop(1);

それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>

Updated by ujihisa . about 2 years ago

  • Status changed from Open to Assigned
  • Assignee set to Nobuyoshi Nakada

Updated by Yui NARUSE about 2 years ago

関連すると推測される Bug #2603 が解決しましたが、こちらは現状どんな感じですか。
あと、永井さんの環境ってディストリビューション何ですか?
まだ再現するようだったら環境を誰かが用意できるように

Updated by Hidetoshi Nagai about 2 years ago

永井@知能.九工大です.

このところ手が回ってなくて,追随できてなくてすみません.

From: Yui NARUSE <redmine@ruby-lang.org>
Subject: [ruby-dev:40123] [Bug #1872] [ruby_1_8] Kernel#system doesn't work in forked process
Date: Fri, 22 Jan 2010 01:43:37 +0900
Message-ID: <4b58843937cbf_8bcebe21d049911@redmine.ruby-lang.org>
> 関連すると推測される Bug #2603 が解決しましたが、こちらは現状どんな感じですか。

試しました.問題は解決したように見えます.

> あと、永井さんの環境ってディストリビューション何ですか?

Vine-3.2 ベースです.
かなり古く,サポートもなくなった環境ですが,
諸事情あってそのまま残している代物です.

そんな古いものは知らねぇよという意見もありそうですが,
完全に無視していいほどには古くないと思ってます.
-- 
永井 秀利  (nagai@ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門

Updated by Yui NARUSE about 2 years ago

  • Status changed from Assigned to Closed
確認ありがとうございました。
それではこれは解決とします。

Also available in: Atom PDF