Feature #8696

Process.setproctitle

Added by Kazuhiro NISHIYAMA about 2 years ago. Updated almost 2 years ago.

[ruby-dev:47548]
Status:Closed
Priority:Normal
Assignee:Akinori MUSHA

Description

$0= と同じ機能が$変数を使わずに書けないようなので、
Process.setproctitle を追加するのはどうでしょうか?

Associated revisions

Revision 42425
Added by Akinori MUSHA about 2 years ago

Add Process.setproctitle().

  • ruby.c (Process.setproctitle): New method to change the title of the running process that is shown in ps(1). [Feature #8696]

Revision 42425
Added by Akinori MUSHA about 2 years ago

Add Process.setproctitle().

  • ruby.c (Process.setproctitle): New method to change the title of the running process that is shown in ps(1). [Feature #8696]

Revision 42426
Added by Akinori MUSHA about 2 years ago

Add Process.argv0.

  • ruby.c (Process.argv0): New method to return the original value of $0. [Feature #8696]

Revision 42426
Added by Akinori MUSHA about 2 years ago

Add Process.argv0.

  • ruby.c (Process.argv0): New method to return the original value of $0. [Feature #8696]

History

#1 Updated by Motohiro KOSAKI about 2 years ago

方向性としては賛成なのですが($0はぐぐらびりてぃ悪いから暗記しないといけないのがイケてない)、
細かい点をいくつか確認させてください。

$0と同等なら Process.name = "hoge" とかのほうが読みやすいんじゃないの?
Process.setproctitle にする意図は?文字列以外も与えたい? Windowsで動かないと暗にいいたい?
$0は書くだけじゃなくて、読むことも出来たと思うのですがそれは出来なくてもよい?

#2 Updated by Kazuhiro NISHIYAMA about 2 years ago

元々 DevelopersMeeting20130727Japan の時の雑談で出た話で、その時も

  • Process.setproctitle
  • Process.name, Process.name=

の両方の案がありました。

setproctitle の理由としては他の Process のメソッドも C API そのままの名前が多いし、そのあたりのメソッドを使う人はそういうことがわかってるはずなので、C API に近い名前の方がわかりやすい、という意見だったと思います。

Process.name{,=} の方は、以前にスレッドに名前をつけたいという話があって、そのメソッドとして Thread にも name や name= を用意するとしたら、対応がとれてわかりやすいという話もありました。

#3 Updated by Yui NARUSE about 2 years ago

znz (Kazuhiro NISHIYAMA) wrote:

元々 DevelopersMeeting20130727Japan の時の雑談で出た話で、その時も

  • Process.setproctitle
  • Process.name, Process.name=

の両方の案がありました。

setproctitle の理由としては他の Process のメソッドも C API そのままの名前が多いし、そのあたりのメソッドを使う人はそういうことがわかってるはずなので、C API に近い名前の方がわかりやすい、という意見だったと思います。

Process.name{,=} の方は、以前にスレッドに名前をつけたいという話があって、そのメソッドとして Thread にも name や name= を用意するとしたら、対応がとれてわかりやすいという話もありました。

Thread#name はそりゃそういう名前になるよねって感じなのですが、
Process.name は Process クラスの name になるのがだいぶ違和感あるんですよね。

#4 Updated by Akinori MUSHA about 2 years ago

getproctitle() というAPIはないので、 Process.setproctitle() でいいんじゃないかと思います。
$0はベタに Process.argv0 でどうでしょう。argv0という名前はTclに先例があります。

$0=でsetproctitle()が呼ばれるのはPerlから引き継いだ仕様だと思いますが、argv[0]を初期値とする$0のsetterがsetproctitle()であるというのは実は対称性がありません。(setproctitle()で設定される文字列の初期値はコマンドライン全体なので)

#5 Updated by Akinori MUSHA about 2 years ago

なお、「プロセスの名前」としては*BSDの getprogname(3)/setprogname(3) も浮かびますが、これはerr(3)によるエラー表示などで使われるものですが、その初期値は File.basename($0) なので$0の別名としては使えなさそうです。

#6 Updated by Nobuyoshi Nakada about 2 years ago

Class#nameとかぶるProcess.nameは芳しくないと思います。
Process.setproctitle()の別名ならProcess.title{,=}じゃないでしょうか。

#7 Updated by Motohiro KOSAKI about 2 years ago

2013/7/30 knu (Akinori MUSHA) knu@ruby-lang.org:

Issue #8696 has been updated by knu (Akinori MUSHA).

getproctitle() というAPIはないので、 Process.setproctitle() でいいんじゃないかと思います。
$0はベタに Process.argv0 でどうでしょう。argv0という名前はTclに先例があります。

現在すでに $PROGRAM_NAME があるわけですが、argv0はそれより分かりやすさが一段落ちる感じ。
C言語は当然知ってるよねという前提はいいのかなあ

getproctitle()というAPIはないというご指摘ですが、Rubyで最後に設定した文字列を覚えておくだけなので
あまり障害になるとは考えていません。
すごい長い文字列を与えた時にsetproctitle()側で勝手に切り詰める仕様があったりすると不一致になりますが
実用上は問題にならないでしょう。それともFreeBSDのような頭にprefix勝手につけるようなsetproctitle()実装を
心配している?

$0=でsetproctitle()が呼ばれるのはPerlから引き継いだ仕様だと思いますが、argv[0]を初期値とする$0のsetterがsetproctitle()であるというのは実は対称性がありません。(setproctitle()で設定される文字列の初期値はコマンドライン全体なので)

これはargv0がよろしくないという理由の1つになっていると思います。

なかださんの指摘しているClass.nameとの衝突は説得力があったので、Process.title か
Process.program_name のどちらかがいいのではないでしょうか。

#8 Updated by Anonymous about 2 years ago

At Sun, 4 Aug 2013 10:01:31 +0900,
KOSAKI Motohiro wrote:

2013/7/30 knu (Akinori MUSHA) knu@ruby-lang.org:

Issue #8696 has been updated by knu (Akinori MUSHA).

私が言いたかったことを整理すると、

  1. $0 のgetter/setterは非対称であり、「$0の別名を作る」という発想でそ
    の歪みを引き継ぐのは好ましくない。つまり、 setproctitle() するAPIと
    オリジナルの $0 を返すAPIは別個に用意し、前者の呼出によって後者の値
    が影響を受けないようにすべき。

  2. 前者はCのAPI上は setter のみなので setproctitle のままでいいし、後
    者は setter なしの Process.argv0 でいいのではないか。

という感じです。

1について補足すると、 setproctitle() のない環境では argv をいじっている
わけですが、その場合も ARGV は影響を受けませんし、同様に常にオリジナル
の $0 の値を返すAPIがあっていいと思います。

getproctitle() というAPIはないので、 Process.setproctitle() でいいんじゃないかと思います。
$0はベタに Process.argv0 でどうでしょう。argv0という名前はTclに先例があります。

現在すでに $PROGRAM_NAME があるわけですが、argv0はそれより分かりやすさが一段落ちる感じ。
C言語は当然知ってるよねという前提はいいのかなあ

ARGV があるので、少なくとも検索の手がかりがないということはなさそう。

getproctitle()というAPIはないというご指摘ですが、Rubyで最後に設定した文字列を覚えておくだけなので
あまり障害になるとは考えていません。
すごい長い文字列を与えた時にsetproctitle()側で勝手に切り詰める仕様があったりすると不一致になりますが
実用上は問題にならないでしょう。それともFreeBSDのような頭にprefix勝手につけるようなsetproctitle()実装を
心配している?

そうですね。不可逆な操作であるということが見えなくなるというのは懸念と
してはあります。

しかしそれよりも、 getproctitle() がないということはまず初期値をどうす
るか、プログラムの他の部分で setproctitle() されたらその値を反映すべき
か(主に Ruby を組み込んだプログラムを想定しています)というところも考
える必要がありますね。

#9 Updated by Akinori MUSHA about 2 years ago

  • % Done changed from 0 to 100
  • Status changed from Open to Closed

This issue was solved with changeset r42425.
Kazuhiro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


Add Process.setproctitle().

  • ruby.c (Process.setproctitle): New method to change the title of the running process that is shown in ps(1). [Feature #8696]

#10 Updated by Yui NARUSE about 2 years ago

  • Category set to core
  • Status changed from Closed to Assigned
  • Assignee set to Yukihiro Matsumoto
  • Target version set to 2.1.0

この追加、まつもとさんの了解取ってませんよね?
coreクラスのAPIの変更は今後はまつもとさんの了解を得てからにして下さい。

この提案どう思いますか?>まつもとさん

#11 Updated by Yui NARUSE about 2 years ago

  • Priority changed from Normal to 5

#12 Updated by Yukihiro Matsumoto about 2 years ago

この提案そのものには賛成なんですが、プラットフォーム依存になりそうなので、環境依存、処理系依存が明記されれば。

まつもと ゆきひろ /:|)

#13 Updated by Akinori MUSHA about 2 years ago

  • Assignee changed from Yukihiro Matsumoto to Akinori MUSHA

プラットフォーム依存についてはすでに書いてありますが、
サポートされない環境でも例外は発生しない旨、追記しておきます。

#14 Updated by Akinori MUSHA almost 2 years ago

  • Status changed from Assigned to Closed

rdocを更新しました。

Also available in: Atom PDF