
答え1
プロセス名を設定する必要があります。一部のシステムでは、 に値を割り当てると$0
機能しますが、Linux では機能しません (少なくとも私のバージョンの では機能しませんruby
)。ここで、ruby
は引数リストのみを設定します (または を参照ps -f
) ps -o args
。プロセス名は設定しません (またはlsof
/ps
を参照ps -o comm
) (は、プロセス名と引数リストの両方を設定するperl -e '$0 = "foo"'
ので機能します)。perl
そのためには、Linux では次の操作を行う必要があります。
prctl(PR_SET_NAME, "newname")
システムコール。
次の方法も考えられます:
$ ruby -e 'syscall(157, 15, "foo"); system("ps")'
PID TTY TIME CMD
5679 pts/4 00:00:01 zsh
8639 pts/4 00:00:00 foo
8641 pts/4 00:00:00 ps
システム コールの値はアーキテクチャに依存します (ここでは amd64 の場合は 157)。
ただし、prctl
のソース コードでを grep してもruby
何も返されないため、 ではすぐに使用できるサポートがないのではないかと思われますruby
。Process.setproctitle()
プロセス名も設定されません。
SOの@Jessehzは次のような解決策を提案している。fiddle
pctrl()
C ライブラリ内の関数を呼び出すには(動的にリンクされていると仮定ruby
します) 次のようにします。
$ ruby -e 'require "fiddle"; Fiddle::Function.new(
Fiddle::Handle["prctl".freeze], [Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP],
Fiddle::TYPE_INT).call(15, "foo"); system("ps")'
PID TTY TIME CMD
5931 pts/5 00:00:02 zsh
8943 pts/5 00:00:00 foo
8945 pts/5 00:00:00 ps
答え2
素晴らしい回答をくれた @Stéphane に感謝します。しかし、私の場合、最善の解決策はスクリプトを Mac OSX アプリとしてバンドルすることでした。プロジェクトの Info.plist でプロセス名を制御できます。