ぼんやりと考えている人

ひろしまなおき (廣島直己)
名前: ひろしまなおき (廣島直己)
住処: シリコンバレー
職業: しがないプログラマ
家族: 愛妻一人、息子一人、娘一人
道具: ハーレー二台、ギター三本
電紙: n at h7a.org

Twitter

« September 2024 »
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

以前にぼんやりと考えたこと

最近のコメント

  • ひろしま (ひらがなせいかつ …): じゅくじくんは なくした ほうが いい ですね。ぼくは…
  • たんぽぽ (ひらがなせいかつ …): きゅうに ぜんぶの ことばを ひらがなだけに する…
  • とね まさひこ… (ひらがなせいかつ …): ぼくは ものかき だが, かんじが きらいなので,…
  • とりえ (ひらがなせいかつ …): このさいとは みているだけで なんとなく ほんわか…
  • ひろしま (思い通りの日本語…): こうどな ほんを よめなければ、こうどな たんごを 学…
  • nt4 (思い通りの日本語…): ひらがなせいかつに初めて接し、興味を覚えました。そ…
  • ひろしま (ひらがなせいかつ …): やはり、がいこくに くらしていたり、がいこくとの か…
  • ぷりうりうぷ… (ひらがなせいかつ …): こんにちは。すうぇーでんに すんでいます。いとうさ…
  • Joi Ito (ひらがなせいかつ …): もと べいにち たいしの Edwin O. Reischauer さん…
  • yonay (理屈じゃないとい…): なんか、著者の主張を誤解しているような気がするよ。…

  • Powered by Pivot - 1.40.5: 'Dreadwind'
  • SPAM Poison
  • XMLフィード(RSS 1.0)
  • Atomフィード

24 February '2007 - 19:15 | 技術動向 darwin ruby では exec が使えない(場合がある)

Lingr 常駐用ツールの Lingresident には !restart というコマンドが実装してある。が、これは実際に期待するような動作をしない。

たとえば設定を変えた時とかコードを修正した時などに、Lingresident の起動をサーバ上でし直すのが面倒なのでチャットルームから再起動できたらいいかな、と思ったのだけれど、残念ながらそういう風には動いてくれない。

理由は、どうやって実装すればいいのかが、まだよく分かっていないから。

ひとつ思いついた方法は、組み込み関数 exec で自分自身を実行し直すという方法。ひとつというか、これしか思いついてない。これが動けば問題ない。

しかし、exec が期待したようには動してくれない。正確に言うと、Lingresident を実行している Linux サーバ上では期待通りに動いたけれど、手元の OSX 上では動かない。サーバ上で動くんだから問題ないとも言えるけれど、手元でテストできないコードをサーバ上で動かすのは気持ちが悪い。

いろいろ試してみた結果、動かないのはスレッドを生成した時だけということらしい。

以下、その問題再現コード。

$ cat test.rb
puts $$.to_s
ARGV.empty? || Thread.new { p Thread.list }.join
p Thread.list
sleep 1
exec 'ruby', $0, *$*

やっていることは、一秒寝てから exec で自分が起動されたようにコマンドを実行すること。ただし、コマンドライン引数があったらスレッドを生成する。以下、Linux での実行結果。

$ ruby --version
ruby 1.8.5 (2006-08-25) [i686-linux]
$ ruby test.rb
6471
[#<Thread:0xb7fee7d4 run>]
6471
[#<Thread:0xb7fee7d4 run>]
6471
[#<Thread:0xb7fee7d4 run>]
6471
[#<Thread:0xb7fee7d4 run>]
^Ctest.rb:6:in `sleep': Interrupt
        from test.rb:6
$ ruby test.rb foo
6490
[#<Thread:0xb7fee7d4 run>, #<Thread:0xb7fe1bc4 run>]
[#<Thread:0xb7fee7d4 run>]
6490
[#<Thread:0xb7fee7d4 run>, #<Thread:0xb7fe1bc4 run>]
[#<Thread:0xb7fee7d4 run>]
6490
[#<Thread:0xb7fee7d4 run>, #<Thread:0xb7fe1bc4 run>]
[#<Thread:0xb7fee7d4 run>]
6490
[#<Thread:0xb7fee7d4 run>, #<Thread:0xb7fe1bc4 run>]
[#<Thread:0xb7fee7d4 run>]
^Ctest.rb:6:in `sleep': Interrupt
        from test.rb:6

特に何も問題なく動いている。

つぎに、OSX 上でのテスト。

$ ruby --version
ruby 1.8.5 (2006-12-25 patchlevel 12) [i686-darwin8.8.1]
$ ruby test.rb
16423
[#<Thread:0x317cc run>]
16423
[#<Thread:0x317cc run>]
16423
[#<Thread:0x317cc run>]
16423
[#<Thread:0x317cc run>]
^Ctest.rb:6:in `sleep': Interrupt
        from test.rb:6
$ ruby test.rb foo
16424
[#<Thread:0x317cc run>, #<Thread:0x253f0 run>]
[#<Thread:0x317cc run>]
test.rb:7:in `exec': Operation not supported - ruby (Errno::EOPNOTSUPP)
        from test.rb:7 

OSX 上ではスレッドが一度でも生成されてしまうと、exec が Errno::EOPNOTSUPP を発生してしまうらしい。理由はよく分からない。ちなみに、exec を system にすると、問題はおきない。

メーリングリストのアーカイブを検索して見たら、昨年十一月に http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/223931 というポストがあった。まったく同じ症状を報告している。ただ、とくに話が続いてないのでどういう扱いになってるかは不明。簡単な再現方法が報告されていないために、誤解されて見過ごされてしまっているのかも知れない。

うーん、どうしようかなあ。

Trackback link:

トラックバック用URLを生成するには、JavaScriptを有効にしてください。


http://blade.nagaokaut.ac.jp/cgi-bin/sca..
あたりを参考に、

Thread.new {}.join
p Thread.list
sleep 1
fork { exec 'ruby', $0, *$* }

という感じで fork してから exec すると動くようです。
なぜだろう。リンクが切れてる... orz
ていうか、そんな裏技があるとは。まあ、fork しちゃうと PID が変わるのが残念ですけれど、当面それで凌いでおこうと思います。ありがとうございます。

ちなみに、メーリングリストに入るのが面倒くさかったので、とりあえず Apple の ruby 担当者と思しき人にメールしてみたら、「Thanks for the report. You are indeed talking to the right person.」って言われました。ので、そのうち治ると思われ。

  
情報を記憶する

Emoticons /

酢ハムがいったいどんなハムなのかはともかく…
 

 

通知:
非公開:

注意: 使用できるタグは <b> と <i> のみです。URLやメールアドレスはそのまま記述すればリンクになります。